Mini Parser- Medium - L

1 minute read

Published:

Question

  • https://leetcode.com/problems/mini-parser/

Given a string s represents the serialization of a nested list, implement a parser to deserialize it and return the deserialized NestedInteger.

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

Approach

  • Stack

Solution

/**
 * // 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 {
public:
    NestedInteger deserialize(string s) {
        stack<NestedInteger> stk({NestedInteger()});
        for (size_t i = 0; i < s.size(); ++i) {
            if (s[i] == '[') {
                stk.push(NestedInteger());
            }
            else if (s[i] == ']') {
                NestedInteger ni = stk.top();
                stk.pop();
                stk.top().add(ni);
            }
            else if (s[i] == ',') {
            }
            else {
                int v = 0;
                bool negative = false;
                if (s[i] == '-') {
                    negative = true;
                    ++i;
                }
                for (; i < s.size() && '0' <= s[i] && s[i] <= '9'; ++i) {
                    v = v * 10 + s[i] - '0';
                }
                if (negative) {
                    v = -v;
                }
                --i;

                stk.top().add(NestedInteger(v));
            }
        }

        return stk.top().getList().front();
    }
};