394.字符串解码

image-20200530205426453

辅助栈

思路

  • 核心难点是如何处理嵌套的[ ] ,需要从内向外生成与拼接字符串
  • 算法流程
    1. 构建辅助栈stack,遍历字符串s中每个字符c
      • 当c为数字时,将数字字符转化为multi,用于后续倍数计算;
      • 当c为字母时,在res尾部添加c;
      • 当c为[时,将当前multi和res入栈,并分别置空:
        • 记录此[前的临时结果res至栈,用于发现对应]后的拼接操作;
        • 记录此[前的倍数multi至栈,用于发现对应]后,获取multi*[...]字符串;
      • 当c为]时,stack出栈,拼接字符串res=last_res+cur_multi*res,其中:
        • last_res是上个[到当前[的字符串,例如3[a2[c]]中的a;
        • cur_multi是当前[到]内字符串的重复倍数,例如3[a2[c]]中的2
    2. 返回字符串res

代码

  /**
     * 1ms   90%  O(n)
     */
    public static String decodeString2(String s) {
        StringBuilder res = new StringBuilder();
        int multi = 0;
        LinkedList<Integer> stack_multi = new LinkedList<>();
        LinkedList<String> stack_res = new LinkedList<>();
        for (Character c : s.toCharArray()) {
            if (c == '[') {
                stack_multi.addLast(multi);
                stack_res.addLast(res.toString());
                multi=0;
                res=new StringBuilder();
            } else if (c == ']') {
                StringBuilder tmp = new StringBuilder();
                int cur_multi = stack_multi.removeLast();
                for (int i = 0; i < cur_multi; i++){
                    tmp.append(res);
                }
                res = new StringBuilder(stack_res.removeLast() + tmp);
            } else if (c >= '0' && c <= '9') {
                //数字的拼接
                multi = multi * 10 + Integer.parseInt(String.valueOf(c));
            } else {
                res.append(c);
            }
        }
        return res.toString();
    }

递归

思路

递归思路原文

代码

class Solution {
    public String decodeString(String s) {
        return dfs(s, 0)[0];
    }
    private String[] dfs(String s, int i) {
        StringBuilder res = new StringBuilder();
        int multi = 0;
        while(i < s.length()) {
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9') 
                multi = multi * 10 + Integer.parseInt(String.valueOf(s.charAt(i))); 
            else if(s.charAt(i) == '[') {
                String[] tmp = dfs(s, i + 1);
                i = Integer.parseInt(tmp[0]);
                while(multi > 0) {
                    res.append(tmp[1]);
                    multi--;
                }
            }
            else if(s.charAt(i) == ']') 
                return new String[] { String.valueOf(i), res.toString() };
            else 
                res.append(String.valueOf(s.charAt(i)));
            i++;
        }
        return new String[] { res.toString() };
    } 
}

参考原文:

krahets:字符串解码(辅助栈法/递归法,清晰图解)

官方题解

原文地址:https://www.cnblogs.com/yh-simon/p/12994924.html