字符串的解码--leetcode 394
参考题目如下:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目:
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: 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"
class Solution {
public:
//最后结果出现的顺序一定是每个字母和[]内出现的次序相一致,无非是括号内部的数据出现了几次而已。所以从头来,如果没有数字和括号
//直接将结果进行保存。如果有的话,那么就先加入一个括号的内容,在添加n-1个就可以了。
string decodeString(string s) {
string ans;
stack<pair<int,int>> stk;
//[] 内数字的数量
int count=0;
for(auto x:s){
//如果是数字的话,就计算数字的数量。
if(isdigit(x)){
//32[abc] 要保证多位数字也同时可以满足相应的要求。
count=count*10+(x-'0');
}
else if(x=='['){
//如果是左括号就是先记录里面的数字的数量,和当前答案的大小。
stk.push({count,ans.size()});
//将对应0 归于0.
count=0;
}
else if(isalpha(x)){
ans+=x;
}
else{
int times=stk.top().first;
string temp=ans.substr(stk.top().second,ans.size()-stk.top().second);
for(int i=0;i<times-1;i++){
ans+=temp;
}
stk.pop();
}
}
return ans;
}
};