394. 字符串解码

136 阅读1分钟

题目描述

思路

  • 关键在于,可能有【】的嵌套,所以用栈来逐对消除【】。由于题目保证输入的正确性,所以每遇到一个说明前面一定有对应的
  • 遍历字符串s,逐个添加char,当遇到时,停止添加,逐个弹栈到,以把【】内的字符展开,并且追加k次。
  • 重复次数k的确定:前的不为char的字符必为数字,把他们*10累加

代码

代码用sb来解决reverse,也可以用栈来reverse,比较麻烦。

class Solution {
    public String decodeString(String s) {
        Stack<Character> stack = new Stack<>();
        StringBuffer res = new StringBuffer();//用sb是因为他有reverse()这个方法,方便
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ']') {//没遇到],持续入栈
                stack.push(s.charAt(i));
            } else {//遇到 ],
                StringBuffer group = new StringBuffer();
                //把[前的字符弹出来,添加到一个sb里
                while (stack.peek() != '[') {
                    group.append(stack.pop());
                }
                //出栈顺序是反的,这里正过来
                group.reverse();
                //把刚才那个【弹了
                stack.pop();
                //此时stack顶元素为数字,可能是一位,也可能是多位,所以求次数不能只pop一次
                int times = 0;
                int m = 1;
                //计算重复几次
                while (!stack.isEmpty() && Character.isDigit(stack.peek())) {
                    int tmp = stack.pop() - '0';
                    times +=  tmp * m;
                    m *= 10;
                }
                //把【】内的字符整体追加times次到栈中
                for (int j = 0; j < times; j++) {
                    for (int k = 0; k < group.length(); k++) {
                        stack.push(group.charAt(k));
                    }
                }
            }
        }
        //到这里,stack中已经没【】和数字了
        while (!stack.isEmpty()) {
            res.append(stack.pop());
        }
        return res.reverse().toString();
    }
}
class Solution {
    public String decodeString(String s) {
        int times = 0;
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                times = times * 10 + (c - '0');
            } else if (Character.isLetter(c)) {
                curStr += c;
            } else if (c == '[') {
                strStack.push(curStr);
                numStack.push(times);
                curStr = "";
                times = 0;
            } else if (c == ']') {
                String prevStr = strStack.pop();
                int t = numStack.pop();
                for (int i = 0; i < t; i++) {
                    prevStr += curStr;
                }
                curStr = prevStr;
            }
        }
        return curStr;

    }
}