方法一:递归
思路很简单,比较好理解,注意细节处理!!!
cpp
class Solution {
public:
string decodeString(string s) {
string ans;
for(int i=0;s[i]!=0;i++){
if(s[i]>='a'&&s[i]<='z')
ans+=s[i];
if(s[i]>='0'&&s[i]<='9'){
int times=0;
while(s[i]>='0'&&s[i]<='9'){
times=times*10+s[i]-'0';
i++;
} //结束时i的位置是'['
int pos=i+1;//i+1为这组[]内的第一个元素
int flag=1; //存在某个[没有配对的时候 flag为1,每一对左右括号都配对后flag=0
while(flag){
i++;
if(s[i]=='[') flag++;
if(s[i]==']') flag--;
}//这个循环结束时i的位置是配对结束时']'的位置
string tmp=decodeString(s.substr(pos,i-pos));
for(int j=0;j<times;j++)
ans+=tmp;
}
}
return ans;
}
};
方法二:数字栈与字符串栈
cpp
class Solution {
public:
string decodeString(string s) {
string res="";
stack<int> nums;
stack<string> strs;
int times=0; //记录次数
for(int i=0;i<s.size();i++){
if(s[i]>='a'&&s[i]<='z') //a-z直接加入res后
res+=s[i];
else if(s[i]>='0'&&s[i]<='9'){ //碰到0-9化成次数,数字可能连续好几位要注意
times=times*10+s[i]-'0';
}
else if(s[i]=='['){ //碰到左括号[,将当前res和当前times各自入栈,并分别置空和置0
nums.push(times);
strs.push(res);
times=0;
res="";
}
else { //碰到右括号]时,操作如下
int tmp=nums.top(); //数字栈的栈顶元素表示次数tmp,然后出栈
nums.pop();
while(tmp--) strs.top()+=res; //将当前res添加tmp次到字符串栈的栈顶后,再赋给res后出栈
res=strs.top(); //之后若还是字母,就会直接加到res之后,因为它们是同一级的运算
//若是左括号,res会被压入strs栈,作为上一层的运算
strs.pop();
}
}
return res;
}
};