LeetCode – Mini Parser (Java)

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;
}

Leave a Comment