zoukankan      html  css  js  c++  java
  • 【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() };
        } 
    }
    
  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13307970.html
Copyright © 2011-2022 走看看