Given a nested list of integers represented as a string, implement a parser to deserialize it.
Each element is either an integer, or a list -- whose elements may also be integers or other lists.
Note: You may assume that the string is well-formed:
- String is non-empty.
- String does not contain white spaces.
- String contains only digits
0-9
,[
,-
,
,]
.
Example 1:
Given s = "324", You should return a NestedInteger object which contains a single integer 324.
Example 2:
Given s = "[123,[456,[789]]]", Return a NestedInteger object containing a nested list with 2 elements: 1. An integer containing value 123. 2. A nested list containing two elements: i. An integer containing value 456. ii. A nested list with one element: a. An integer containing value 789.
参考资料:here。
参考资料讲的非常好。
对于这种拥有重复结构的字符串的处理,很容易想到使用递归的方式解决。
在使用了递归后,可以使用栈来模拟递归的过程。
class Solution {
public:
NestedInteger deserialize(string s) {
if (s.empty()) return NestedInteger();
if (s[0] != '[') return NestedInteger(stoi(s));
stack<NestedInteger> ans;
int start = 1;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '[') {
ans.push(NestedInteger());
start = i + 1;
}
else if(s[i] == ',' || s[i] == ']') {
if (i > start) ans.top().add(stoi(s.substr(start, i - start)));
start = i + 1;
if (s[i] == ']') {
if(ans.size()>1){
NestedInteger tmp = ans.top();
ans.pop();
ans.top().add(tmp);
}
}
}
}
return ans.top();
}
};