辅助栈
- s[i]为字母,res+=s[i]
- s[i]为数字,cnt = cnt*10 + s[i]-‘0’;
- s[i]为’[',入栈(res,cnt),随后将其置为空
- res入栈,代表需要解码字符串之前的字符串,防止丢失
- cnt入栈,代表接下来需要解码的字符串的次数
- res置为空,代表获取接下来需要解码的字符串
- cnt置为空,代表可能出出现嵌套式的解码字符串
- s[i]为’]',出栈(str, cnt)
class Solution {
public:
string decodeString(string s) {
string res = "";
int cnt = 0;
stack<pair<int,string>> encoded_stack;
int len = s.size();
for(auto c : s)
{
if(c == '[')
{
encoded_stack.emplace(cnt, res);
cnt = 0;
res = "";
}
else if(c == ']')
{
pair<int, string> p = encoded_stack.top();
encoded_stack.pop();
cnt = p.first - 1;
string tmp = res;
while(cnt)
{
res += tmp;
cnt--;
}
res = p.second + res;
}
else if(c>='0' && c<='9')
cnt = cnt * 10 + c - '0';
else
res += c;
}
return res;
}
};
递归
- 以’['作为递归的开始
- 以‘]'作为递归的结束
class Solution {
public:
string dfs(string& s, int& index)
{
string res = "";
int cnt = 0;
while(index < s.size())
{
if(s[index]>='0' && s[index]<='9')
cnt = cnt*10 + s[index]-'0';
else if(s[index] == '[')
{
index++;
string str = dfs(s, index);
while(cnt)
{
res += str;
cnt--;
}
}
else if(s[index] == ']')
return res;
else
res += s[index];
index++;
}
return res;
}
string decodeString(string s) {
int index = 0;
return dfs(s,index);
}
};