题意:解码字符串,看输入输出就能懂了。
s = "3[a]2[bc]", return "aaabcbc". s = "3[a2[c]]", return "accaccacc". s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
用人的思维方式来做,挺复杂的。
还好有栈这种神奇的数据结构。
碰到'[',就把当前状态放在栈里,
碰到']',就把栈里的东西拿出来更新。
class Solution {
public:
string decodeString(string s) {
string ans = "";
int num = 0;
stack<int> s_num;
stack<string> s_str;
for (int i = 0; i<s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
num = num * 10 + s[i] - '0';
else if (s[i] == '[')
{
s_num.push(num);
s_str.push(ans);
num = 0;
ans.clear();
}
else if (s[i] == ']')
{
int k = s_num.top();
s_num.pop();
string temp = s_str.top();
for (int j = 0; j<k; j++)
s_str.top() += ans;
ans = s_str.top();
s_str.pop();
}
else
ans += s[i];
}
return s_str.empty() ? ans : s_str.top();
}
};
对这种嵌套的东西,栈还是很好用啊!
还有一个方法是递归,这个东西想到很难,理解很容易啊!
class Solution {
public:
string decodeString(string s) {
int i = 0;
return decode(s, i);
}
string decode(string s, int& i) {
string res = "";
int n = s.size();
while (i < n && s[i] != ']') {
if (s[i] < '0' || s[i] > '9') {
res += s[i++];
} else {
int cnt = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
cnt = cnt * 10 + s[i++] - '0';
}
++i;
string t = decode(s, i);
++i;
while (cnt-- > 0) {
res += t;
}
}
}
return res;
}
};