394. 字符串解码(辅助栈+字符串栈)

题解

  • 题意:字符串的编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 给定一个经过编码的字符串,返回它解码后的字符串
  • 样例

s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.

  • 题解:无疑,越是嵌套在里面的括号,要被重复的次数就越多,一定是越里层括号包含的字符串就越早进行复制。里层代表着后到,后到的字符串先进行复制,那无疑就是使用到了栈的后进先出的特点,编程的时候可以考虑使用递归,也可以考虑使用栈容器正向思考。
  • 对于有一部分是辅助信息,一部分是关键信息的输入字符串,我们最好利用一个辅助栈+一个主要栈的形式来分开保留信息。
  • 我们使用辅助栈st记录重复次数,也就是数字,然后利用主要栈st2来记录每个括号括起来的字符串,每当遇到右括号]的时候,就将st2中的内容弹出来,一直弹到左括号[,利用字符串临时变量tmp将里面的字符串保留下来,然后在st的顶部记录着重复次数n,再将tmp重复n次即可。
  • 如何正确的处理嵌套括号呢?
    • 其实没什么特殊处理,只要得到的tmp重新存入st2中即可,因为下次再进行复制的时候,就是将整体进行复制了。
  • 实现:要注意k>=10的时候字符串转int的处理,以及辅助栈st在什么时候将得到的数字放入栈中。最后要注意栈是倒序即可。
class Solution {
     
    public String decodeString(String s) {
     
        char[] ss = s.toCharArray();
        Stack<Integer> st = new Stack<>();
        Stack<StringBuilder> st2 = new Stack<>();
        StringBuilder res =new StringBuilder();
        StringBuilder tmp;
        int num = 0;
        for(char c:ss){
     
            if(c<='9' && c >= '0') num = num*10+c-'0';
            else if(c!=']'){
     
                if(c=='[') st.add(num);
                num = 0;
                st2.add(new StringBuilder(String.valueOf(c)));
            }
            else{
     
                tmp = new StringBuilder();
                while(!st2.isEmpty()&&st2.peek().toString().equals("[")==false) 
                	tmp.append(st2.pop());
                
                st2.pop(); //将[ pop出来
                int n = st.pop();
                num = 0;
                StringBuilder tmp2 = new StringBuilder();
                for(int i = 0;i < n;i++) tmp2.append(tmp);
                
                st2.add(tmp2);
            }
        } 
        while(st2.isEmpty()==false) res.append(st2.pop());
        return res.reverse().toString();
    }
}

题目

  • 字符串编码

你可能感兴趣的:(Leetcode题目)