思路:
这个题 很明显用栈来处理,但是,我有思路了,一做就错,自己写的乱乱的,理不清楚逻辑了。
首先我们需要两个栈一个用来放数字,一个用来放字符串。当我们遇到‘[‘时,就把上次的暂存的字符串和得到的数字大小分别放入各自的栈中。如果遇到‘]‘就开始取出栈顶的数字,并且以这个大小循环这多次,把存放字符串的栈顶元素加自己。然后取出这个字符串。取出来的原因是因为结束了这次的‘]‘,如果我们下次可能还是字母,那么这个字符串和新的字母是同一级别的,我们还要加入到这个字符串中。如果是‘[‘,那么就会把他放回栈里不会有影响。
代码:
class Solution {
public:
string decodeString(string s) {
string res="";
stack<int> nums;
stack<string> str;
int num=0;
int len = s.length();
for(int i=0;i<len;++i){
if(s[i]>=‘0‘&&s[i]<=‘9‘){ //计算前面数字的大小,可能不是一位数
num = num*10+s[i]-‘0‘;
}
else if((s[i]>=‘a‘&&s[i]<=‘z‘)||s[i]>=‘A‘&&s[i]<=‘Z‘){ //遇到字母就加入res
res += s[i];
}
else if(s[i]==‘[‘){ //遇到‘[‘就将res和num分别放入数组,是结束上一次的[获得的元素,并准备这一次的‘[‘的新元素
nums.push(num);
num=0;
str.push(res);
res="";
}
else if(s[i]==‘]‘){
int times = nums.top();
nums.pop();
while(times--){
str.top() += res;
}
res=str.top(); //主要是为了]之后还是字母的情况,因为是同一级别的,所以还要加入res中。如2[A]A,这两个A是同一级的。
str.pop();
}
}
return res;
}
};
原文:https://www.cnblogs.com/Mrsdwang/p/14715542.html