感觉糊里糊涂的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;}
};