1.题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = “3[a]2[bc]”
输出:“aaabcbc”
示例 2:
输入:s = “3[a2[c]]”
输出:“accaccacc”
示例 3:
输入:s = “2[abc]3[cd]ef”
输出:“abcabccdcdcdef”
示例 4:
输入:s = “abc3[cd]xyz”
输出:“abccdcdcdxyz”
2.思路
每当遇到’[‘就把之前的字符串和数字入栈,并将数字和字符串置0置空,每当遇到’]’就取出栈顶的数字和字符串拼接起来。总的来说就是每进入一层括号,就把括号之前的状态存储下来,每退出一层括号,就计算上一个状态。
3.代码
class Solution {
public:
struct node{
string s;
int k;
};
string decodeString(string s) {
stack<node> st;
string ans;
int sum=0;
for(int i=0;i<s.size();i++){
if(s[i]>='0' && s[i]<='9'){
sum = sum*10 + s[i] - '0';
}else if(s[i]=='['){ //新建节点入栈,sum复位
node t;
t.k=sum;
st.push(t);
sum = 0;
}else if(s[i]==']'){ //节点出栈
node t=st.top();
st.pop();
string tmp;
for(int j=0;j<t.k;j++) tmp += t.s;
if(st.empty()) //栈已空,说明已无嵌套
ans += tmp;
else
st.top().s += tmp;
}else{
if(st.empty()) //首部字符
ans += s[i];
else
st.top().s += s[i];
}
}
return ans;
}
};
版权声明:本文为weixin_43202635原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。