思路1:栈来匹配括号
具体思路:
step1:从左向右遍历字符串。
如果该元素是字母或者’[‘:将该字符转化为字符串入栈。
如果该字符是数字,则循环得到这个长的数字,然后入栈。
如果该字符是’]‘,则不断出栈直到出栈一个’[',出栈的字符串依次push_back()到vector,从后往前连接为一个长的字符串,再出栈一个元素(一定为数字),然后将该长的字符串的数字倍入栈。
step2:依次将栈底到栈顶的字符串连接,即为ans。(因此栈用vector来做)
class Solution {
public:
string decodeString(string s) {
vector<string> v;
int i = 0, n = s.size();
while (i < n) {
if (isdigit(s[i])) {
string tmp;
while ('0' <= s[i] && s[i] <= '9') {
tmp += s[i];
++i;
}
v.push_back(tmp);
}else if (s[i] != ']') { //为[或者字母时
v.push_back(string(1, s[i]));
++i;
}
else { //为 ']'时
vector<string> tmp;
string s, s2;
while (v.back() != "[") {
tmp.push_back(v.back());
v.pop_back();
}
v.pop_back(); //"["
for (int i = tmp.size() - 1; i >= 0; --i) { //从后往前
s = s + tmp[i];
}
int tmp2 = stoi(v.back());
v.pop_back(); //数字
for (int i = 0; i < tmp2; ++i) {
s2 += s;
}
v.push_back(s2);
++i;
}
}
string ans;
for (auto& each : v) {
ans += each;
}
return ans;
}
};