[LeetCode] 385. Mini Parser
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.
Thought process:
Iterate through the string. There are five cases:
- Digit: keep track of current number.
- [: push the current NestedInteger onto stack and create a new NestedInteger.
- -: set sign to -1.
- ,: if the previous character is a digit, add the number into current NestedInteger. If the previous character is ], add the current NestedInteger to previous NestedInteger.
- ]: current NestedInteger is finished. Pop the NestedInteger from top of the stack.
Solution:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | /** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * public interface NestedInteger { * // Constructor initializes an empty nested list. * public NestedInteger(); * * // Constructor initializes a single integer. * public NestedInteger(int value); * * // @return true if this NestedInteger holds a single integer, rather than a nested list. * public boolean isInteger(); * * // @return the single integer that this NestedInteger holds, if it holds a single integer * // Return null if this NestedInteger holds a nested list * public Integer getInteger(); * * // Set this NestedInteger to hold a single integer. * public void setInteger(int value); * * // Set this NestedInteger to hold a nested list and adds a nested integer to it. * public void add(NestedInteger ni); * * // @return the nested list that this NestedInteger holds, if it holds a nested list * // Return null if this NestedInteger holds a single integer * public List<NestedInteger> getList(); * } */ public class Solution { public NestedInteger deserialize(String s) { if (s.length() == 0) { return new NestedInteger(); } if (s.charAt(0) != '[') { return new NestedInteger(Integer.parseInt(s)); } NestedInteger current = null; Stack<NestedInteger> stack = new Stack<>(); int left = 0; int right = 0; for (; right < s.length(); right++) { char c = s.charAt(right); if (c == '[') { if (current != null) { stack.push(current); } current = new NestedInteger(); left = right + 1; } else if (c == ']') { String number = s.substring(left, right); if (number.length() > 0) { current.add(new NestedInteger(Integer.parseInt(number))); } if (!stack.isEmpty()) { NestedInteger parent = stack.pop(); parent.add(current); current = parent; } left = right + 1; } else if (c == ',') { if (s.charAt(right - 1) != ']') { current.add(new NestedInteger(Integer.parseInt(s.substring(left, right)))); } left = right + 1; } } return current; } } |
Time complexity: O(n).
Comments
Post a Comment