<p>Given a string s represents the serialization of a nested list, implement a parser to deserialize it and return <em>the deserialized</em> <code>NestedInteger</code>.</p>

<p>Each element is either an integer or a list whose elements may also be integers or other lists.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;324&quot;
<strong>Output:</strong> 324
<strong>Explanation:</strong> You should return a NestedInteger object which contains a single integer 324.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;[123,[456,[789]]]&quot;
<strong>Output:</strong> [123,[456,[789]]]
<strong>Explanation:</strong> 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
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 5 * 10<sup>4</sup></code></li>
	<li><code>s</code> consists of digits, square brackets <code>&quot;[]&quot;</code>, negative sign <code>&#39;-&#39;</code>, and commas <code>&#39;,&#39;</code>.</li>
	<li><code>s</code> is the serialization of valid <code>NestedInteger</code>.</li>
	<li>All the values in the input are in the range <code>[-10<sup>6</sup>, 10<sup>6</sup>]</code>.</li>
</ul>

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * class NestedInteger {
 *   public:
 *     // Constructor initializes an empty nested list.
 *     NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     NestedInteger(int value);
 *
 *     // Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     bool isInteger() const;
 *
 *     // Return the single integer that this NestedInteger holds, if it holds a single integer
 *     // The result is undefined if this NestedInteger holds a nested list
 *     int getInteger() const;
 *
 *     // Set this NestedInteger to hold a single integer.
 *     void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     void add(const NestedInteger &ni);
 *
 *     // Return the nested list that this NestedInteger holds, if it holds a nested list
 *     // The result is undefined if this NestedInteger holds a single integer
 *     const vector<NestedInteger> &getList() const;
 * };
 */
class Solution {
private:
    int to_num(string& s, int i, int j) {
        int num = 0;
        int base = 1;
        bool sign = s[i] != '-';
        if(!sign) {
            i++;
        }
        while(j >= i) {
            num += (s[j--] + 1 -'1')*base;
            base *= 10;
        }
        
        return sign? num: 0 - num;
    }
private:
    NestedInteger f(string& s, int i, int j) {
        if(s[i] == '[') {
            if(s[i+1] == ']') {
                return NestedInteger{};
            }
            i++;
            j--;
            int iCopy = i;
            NestedInteger list{};

            int diff = 0;

            bool isList = false;
            bool isNumbers = true;

            while(i < j) {
                if(s[i] == ',') {
                    cout << i << endl;
                    isNumbers = false;
                    if(diff == 0) {
                        isList = true;
                        list.add(f(s, iCopy, i-1));
                        iCopy = i+1;
                    }
                } else if(s[i] == '[') {
                    isNumbers = false;
                    diff++;
                } else if(s[i] == ']') {
                    isNumbers = false;
                    diff--;
                }

                i++;
            }

            if(isNumbers) {
                list.add(NestedInteger(to_num(s, iCopy, j)));
            } else  {
                list.add(f(s, iCopy, j));
            } 

            return list;
        }

        return NestedInteger(to_num(s, i, j));
    }

public:
    NestedInteger deserialize(string s) {
        return f(s, 0, s.length()-1);
    }
};
18500