leetcode 力扣 394 字符串解码

68 阅读1分钟

一个栈

算法思路

  • s分成一层一层,[...[为一层,把s旋转90度,看起来就像栈一样,如下图。
  • 遇到[,就把当前层的数字和字符串压入栈。
  • 当前层的数字表示下一层要重复多少次,当前层的字符串作为prev,与重复后的下一层拼接。

111.jpeg

下面再举一个例子

1.jpeg

2.jpeg

3.jpeg

4.jpeg

5.jpeg

6.jpeg

7.jpeg

8.jpeg

9.jpeg

代码简直就是StringStringBuffer的API大杂烩

class Solution {
    public String decodeString(String s) {
        // 使用一个 StringBuffer 栈保存遇到 [ 前的字符串
        Deque<StringBuffer> stack = new ArrayDeque<>();

        // [ 前遇到的字符
        StringBuffer curStr = new StringBuffer();

        // [ 前遇到的数字
        int curNum = 0;

        // 遍历 s 的每个字符
        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch)) {
                curNum = curNum * 10 + (ch - '0');
            } else if (ch == '[') {
                // 先把数字压入栈
                stack.addFirst(new StringBuffer(String.valueOf(curNum)));
                // 重置,准备保存下一个数字
                curNum = 0;

                // 再把字符压入栈
                stack.addFirst(new StringBuffer(curStr.toString()));
                // 重置,准备保存下一个字符
                curStr = new StringBuffer();
            } else if (ch == ']') {
                // 字符先出栈
                StringBuffer prev = stack.removeFirst();

                // 数字再出栈
                int times = Integer.parseInt(String.valueOf(stack.removeFirst()));

                // 将 curStr 重复 times - 1 次
                curStr.append(String.valueOf(curStr).repeat(Math.max(0, times - 1)));

                // curStr 重置为 prev + 重复后的 curStr
                curStr = prev.append(curStr);
            } else {
                curStr.append(ch);
            }
        }

        return curStr.toString();
    }
}