有点烧脑。
看了题解写出来的,在纸上画了画
主要用栈 但是怎么存放数据呢?这是一个问题
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
string decodeString(string s) {
//思考一下可以用栈
//参考答案<int str(之前的res)'>
//遇到]出栈
//遇到[入栈
//k会>9吗 可能
int num=0;
string tmp="";
string res="";
stack<pair<int,string>> ex;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
num=num*10+(s[i]-'0');//计算num
}else if(s[i]=='['){
ex.push(make_pair(num,tmp));
tmp="";
num=0;
}else if(s[i]==']'){
pair<int,string> now=ex.top();
string nstr="";
for(int q=0;q<now.first;q++){
nstr+=tmp;//得到重复的这一部分
}
tmp=now.second+nstr;//tmp展开了
res=tmp;
// res+=nstr;
//tmp="";
num=0;
ex.pop();
}else{
tmp+=s[i];
}
}
res=tmp;
return res;
}
};
网友评论