题意:解码字符串,看输入输出就能懂了。
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; } };