leetcode 394. 字符串解码

感觉糊里糊涂的AC了,感觉还要二刷。。。
题目链接leetcode 394

1.题目

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

2.示例

1)示例 1:
输入:s = “3[a]2[bc]”
输出:“aaabcbc”

2)示例 2:
输入:s = “3[a2[c]]”
输出:“accaccacc”

3)示例 3:
输入:s = “2[abc]3[cd]ef”
输出:“abcabccdcdcdef”

4)示例 4:
输入:s = “abc3[cd]xyz”
输出:“abccdcdcdxyz”

5)提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 ‘[]’ 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]

3.分析

我觉得是一个栈+递归的问题,
1)首先从栈的角度出发,算是括号匹配的加强版,基础思路还是当字符是’[‘时候就入栈,遇到第一个’]‘时候就出栈,此时这个’]‘与栈顶是匹配的。
2)我们考虑一个字符串被定义为k[encoded_string],但是里面的encoded_string也可以是“普通字符串”+k[encoded_string]+“普通字符串”(这里的普通字符串定义为不含中括号和数字的字符串)
3)那么我们的目标转化为去寻找与第一个’[‘匹配的’]',所以当当前字符为‘]’并且pop后栈为空,那么s[栈顶+1:i]这一部分就是encoded_string了
4)当当前字符为小写英文字母时,栈又为空,说明他们时普通字符,直接在字符串后+即可

4.代码

class Solution {
public:
    string decodeString(string s){
        stack<int> st;
        map<int,int> num;
        int cnt=0;string ans="";
        for(int i=0;i<s.size();i++){
            if(s[i]>='0'&&s[i]<='9')
                cnt=cnt*10+s[i]-'0';
            if(s[i]=='['){
                st.push(i);
                num[i]=cnt;cnt=0;
                flag=false;
            }
            if(s[i]==']'){
                int top=st.top();st.pop();
                if(st.empty()){
                    string ans1=decodeString(s.substr(top+1,(i-top+1-2)));
                    for(int j=0;j<num[top];j++)
                    ans+=ans1;
                    cnt=0;
                }
            }
            if(s[i]>='a'&&s[i]<='z'&&st.empty()) ans+=s[i];
        }
        return ans;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法)