• 【LeetCode】394.字符串解码(辅助栈、递归、详细图解)


    题目

    链接

    image-20200713215930923

    分析

    解法一:辅助栈法

    • 本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。

    image-20200713211902662
    动图演示

    class Solution {
        public String decodeString(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(c + "");
                else res.append(c);
            }
            return res.toString();
        }
    }
    

    解法二:递归法

    • 总体思路与辅助栈法一致,不同点在于将 [] 分别作为递归的开启与终止条件:
      • s[i] == ']' 时,返回当前括号内记录的 res 字符串与 ] 的索引 i (更新上层递归指针位置);
      • s[i] == '[' 时,开启新一层递归,记录此 [...] 内字符串 tmp 和递归后的最新索引 i,并执行 res + multi * tmp 拼接字符串。
      • 遍历完毕后返回 res
    • 复杂度分析:
      • 时间复杂度 O(N),递归会更新索引,因此实际上还是一次遍历 s
      • 空间复杂度 O(N),极端情况下递归深度将会达到线性级别。
    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() };
        } 
    }
    
  • 相关阅读:
    aa
    MySQL5.8下载及安装——免安装版
    eclipse中修改项目名
    利用kibana学习 elasticsearch restful api (DSL)
    https://www.cnblogs.com/shwee/p/9084535.html
    springboot+mybatis实现动态切换数据源
    docker-machine命令安装
    Docker 安装 RabbitMq
    yum 找不到程序,yum更换国内阿里源
    CentOS安装etcd和flannel实现Docker跨物理机通信
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13307970.html
Copyright © 2020-2023  润新知