遍历字符串
数字入栈,左括号入栈,字符入栈
遇到右括号开始出栈,一直到对应左括号出栈
出栈序列翻转后拼成一个字符串,此时栈顶即是该字符串的重复次数
构建新的字符串入栈,重复以上操作。
class Solution {
public:
string getDigits(string s,size_t *ptr) {
string str = "";
while(isdigit(s[*ptr])) {
str.push_back(s[(*ptr)++]);
}
return str;
}
//把容器中的string连成一个字符串返回
string getString(vector<string> vec) {
string ret = "";
for(size_t i = 0;i<vec.size();++i) {
ret+=vec[i];
}
return ret;
}
string decodeString(string s) {
size_t len = s.length();
size_t i = 0;
vector<string> stk;//用不定长数组模拟栈的原因是方便从栈底到栈顶遍历(翻转字符串用)
while(i<len) {
char ch = s[i];
if(isdigit(ch)) {//数字入栈
string num = getDigits(s,&i);
stk.push_back(num);
}
else if(isalpha(ch)||ch=='[') {//字符或者左括号入栈
stk.push_back(string(1,s[i++]));//将这个字符转成字符串后入栈
}
else {//右括号 一直出栈,直到遇见左括号
vector<string> sub;
while(stk.back()!="[") {
sub.push_back(stk.back());
stk.pop_back();
}
stk.pop_back();//左括号出栈
int rep = stoi(stk.back());//所对应字符串重复字数 stoi字符串转数字
stk.pop_back();
reverse(sub.begin(),sub.end());//algorithm
string s1 = "",s2 = getString(sub);//把容器中的string拼起来
while(rep--) {
s1+=s2;
}
stk.push_back(s1);
i++;
}
}
return getString(stk.back());
}
};