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 digits0-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.
public NestedInteger deserialize(String s) {
if (s == null || s.isEmpty()) {
return new NestedInteger();
}
if (s.charAt(0) != '[') {
return new NestedInteger(Integer.valueOf(s));
}
NestedInteger res = new NestedInteger();
Stack<NestedInteger> stack = new Stack<>();
int start = 1;
for (int end = 0; end < s.length(); end++) {
char cur = s.charAt(end);
if (cur == '[') {
stack.push(new NestedInteger());
start = end + 1;// increase start position
} else if (cur == ',' || cur == ']') {
if (start < end) {// prevent "[]"
NestedInteger num = new NestedInteger(Integer.valueOf(s.substring(start, end)));
stack.peek().add(num);
}
if (cur == ']') {
if (stack.size() > 1) {// add upper ones to lower ones
NestedInteger last = stack.pop();
stack.peek().add(last);
}
}
start = end + 1;// increase start position
}
}
return stack.peek();
}