zoukankan      html  css  js  c++  java
  • 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:字符串解码(辅助栈法/递归法,清晰图解)

    官方题解

  • 相关阅读:
    ansible的管理与剧本
    条件随机场入门(二) 条件随机场的模型表示
    条件随机场入门(一) 概率无向图模型
    隐马尔科夫模型
    高斯混合模型 GMM
    K-Means 算法
    EM 算法
    Sequential Minimal Optimization (SMO) 算法
    LinkedIn文本分析平台:主题挖掘的四大技术步骤
    SVM 核方法
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12994924.html
Copyright © 2011-2022 走看看