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 and “[],”
For example,
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.
Java Solution
To solve this problem, we should add more example to make clear what is the expected output. For example, s = “[123,[456],789]” is a legal input.
public NestedInteger deserialize(String s) { Stack<NestedInteger> stack = new Stack<>(); StringBuilder sb = new StringBuilder(); for(int i=0; i<s.length(); i++){ char c = s.charAt(i); switch(c){ case '[': NestedInteger ni = new NestedInteger(); stack.push(ni); break; case ']': if(sb.length()>0){ //123, not [456], stack.peek().add(new NestedInteger(Integer.parseInt(sb.toString()))); sb=sb.delete(0, sb.length()); } NestedInteger top = stack.pop(); if(stack.isEmpty()){ return top; }else{ stack.peek().add(top); } break; case ',': if(sb.length()>0){ //hande case "123," not "[456]," stack.peek().add(new NestedInteger(Integer.parseInt(sb.toString()))); sb=sb.delete(0, sb.length()); } break; default: //digits sb.append(c); } } //handle case "123" if(sb.length()>0){ return new NestedInteger(Integer.parseInt(sb.toString())); } return null; } |