美文网首页
[leetcode/lintcode 题解] 解码字符串 ·

[leetcode/lintcode 题解] 解码字符串 ·

作者: SunnyZhao2019 | 来源:发表于2020-05-28 14:40 被阅读0次

leetcode/lintcode 题解] 解码字符串 · Decode String

【题目描述】

给出一个表达式 s,此表达式包括数字,字母以及方括号。在方括号前的数字表示方括号内容的重复次数(括号内的内容可以是字符串或另一个表达式),请将这个表达式展开成一个字符串。

数字只能出现在“[]”前面。

在线测评地址:

https://www.lintcode.com/problem/decode-string/?utm_source=sc-js-mh0528

【样例】

样例1

<pre>输入: S = abc3[a]
输出: "abcaaa"</pre>

样例2

<pre>输入: S = 3[2[ad]3[pf]]xyz
输出: "adadpfpfpfadadpfpfpfadadpfpfpfxyz"</pre>

【题解】

<pre>public class Solution {
    /**
     * @param s  an expression includes numbers, letters and brackets
     * @return a string
     */
    public String expressionExpand(String s) {
        Stack<Object> stack = new Stack<>();
        int number = 0;

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                number = number * 10 + c - '0';
            } else if (c == '[') {
                stack.push(Integer.valueOf(number));
                number = 0;
            } else if (c == ']') {
                String newStr = popStack(stack);
                Integer count = (Integer) stack.pop();
                for (int i = 0; i < count; i++) {
                    stack.push(newStr);
                }
            } else {
                stack.push(String.valueOf(c));
            }
        }

        return popStack(stack);
    }

    private String popStack(Stack<Object> stack) {
        // pop stack until get a number or empty
        Stack<String> buffer = new Stack<>();
        while (!stack.isEmpty() && (stack.peek() instanceof String)) {
            buffer.push((String) stack.pop());
        }

        StringBuilder sb = new StringBuilder();
        while (!buffer.isEmpty()) {
            sb.append(buffer.pop());
        }
        return sb.toString();
    }
}</pre>

【更多语言代码参考】

https://www.jiuzhang.com/solution/decode-string/?utm_source=sc-js-mh0528

相关文章

网友评论

      本文标题:[leetcode/lintcode 题解] 解码字符串 ·

      本文链接:https://www.haomeiwen.com/subject/shqaahtx.html