题意
题解
方法一:栈
class Solution {
public:
string decodeString(string s) {
string res;
int n = s.size();
int i = 0;
while(i < n) {
if (isalnum(s[i]) && !isdigit(s[i])) {
res.push_back(s[i]);
i++;
continue;
}
int num = 0;
while (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
i++;
}
i++;
string tmp;
stack<char> st;
st.push('[');
int flag = 0;
while (!st.empty() ) {
if (s[i] == '[') {
st.push('[');
flag = 1;
}
if (s[i] == ']' && st.top() == '[') st.pop();
if (!st.empty()) {
tmp.push_back(s[i]);
}
i++;
}
if (flag == 1) tmp = decodeString(tmp);
while (num--) {
for (char c : tmp) {
res.push_back(c);
}
}
}
return res;
}
};
虽然丑,但是速度还是挺快的
方法二:数字栈和字符串栈
数字存放在数字栈,字符串存放在字符串栈,遇到右括号时候弹出一个数字栈,字母栈弹到左括号为止。就是逆波兰式那种题。