核心在于规则:
1、通过str和num来搜集记录遇到的字母和数字
2、遇到 '[' 字母str,数字num分别入栈,并重置(入栈了后信息保留,重置供后面的使用)
3、遇到 ']' 出栈两次,取出栈内的str 和num 并与目前的str组合,结果为 栈内str+num*目前的str
详细过程可以看笔记图。
class Solution {
public:
string getnum(string s)
{ string res;
for(int i=0;i<s.size();i++)
{
if(!isdigit(s[i]))
{
res= s.substr(0,i);
break;
}
}
return res;
}
string decodeString(string s) {
string str="";
string num="";
int size =s.size();
stack<string>stk;
for(int i=0;i<s.size();i++)
{
char crr = s[i];
if(isdigit(crr))
{ //搜集数字
string t =s.substr(i,size-i+1);
num = getnum(t);
i+=num.size()-1;
}
else if(isalpha(crr))
{ //搜集字母
str+=crr;
}else if(crr=='[')
{ //遇左括号两次入栈
stk.push(str);
stk.push(num);
str="";
num="";
}
else if(crr ==']')
{// 遇右括号两次出栈
string _num;
string _str;
_num = stk.top();
stk.pop();
_str = stk.top();
stk.pop();
int times = stoi(_num);
for(int k=0;k<times;k++)
{
_str +=str; //旧的组合上新的
}
str =_str;
cout<<str<<endl;
}
}
return str;
}
};