我越来越菜了
由于括号是包裹的,后出现的左括号会匹配后面遇到的第一个右括号,所以使用堆栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: string decodeString(string s) { string ret = ""; stack<string> st; stack<int> num; int curNum = 0; for(auto& ch : s) { if(ch == '[') { st.push(ret); num.push(curNum); curNum = 0; ret = ""; }else if(ch == ']') { auto p = st.top(); st.pop(); auto c = num.top(); num.pop(); for(int i = 0; i < c; ++i) p += ret; ret = p; }else if(ch <= '9' && ch >= '0') curNum = curNum * 10 + ch - '0'; else ret += ch; } return ret; } };
|
递归
本质上就是将堆栈方法改为了函数递归栈实现,碰到]就返回,碰到[就进去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public: string decodeString(string s) { int index = 0; return helper(s, index); } private: string helper(string& s, int& index) { string ret = ""; int num = 0; while(index < s.size()) { if(s[index] == ']') break; if(s[index] >= 'a' && s[index] <= 'z') ret += s[index++]; else { int num = 0; while(s[index] >= '0' && s[index] <= '9') num = num * 10 + s[index++] - '0'; ++index; auto t = helper(s, index); while(num-- > 0) ret += t; ++index; } } return ret; } };
|
处理一个框框中的数据,框框里遇到框框就再递归
review
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: string decodeString(string s) { int i = 0; return helper(s, i, s.size()); } private: string helper(string& s, int& i, int n) { int num = 0; string ret; for(; i < n; ++i) { if(s[i] >= '0' && s[i] <= '9') num = num * 10 + s[i] - '0'; else if(s[i] == ']') return ret; else if(s[i] == '[') { string inner = helper(s, ++i, n); if(num == 0) num = 1; do ret += inner; while(--num); }else ret += s[i]; } return ret; } };
|