[LeetCode] Mini Parser 迷你解析器

 

Given a nested list of integers represented as a string, implement a parser to deserialize it.html

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

Note: You may assume that the string is well-formed:python

  • String is non-empty.
  • String does not contain white spaces.
  • String contains only digits 0-9[- ,].

 

Example 1:git

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.

 

這道題讓咱們實現一個迷你解析器用來把一個字符串解析成NestInteger類,關於這個嵌套鏈表類的題咱們以前作過三道,Nested List Weight Sum IIFlatten Nested List Iterator,和Nested List Weight Sum。應該對這個類並不陌生了,咱們能夠先用遞歸來作,思路是,首先判斷s是否爲空,爲空直接返回,不爲空的話看首字符是否爲'[',不是的話說明s爲一個整數,咱們直接返回結果。若是首字符是'[',且s長度小於等於2,說明沒有內容,直接返回結果。反之若是s長度大於2,咱們從i=1開始遍歷,咱們須要一個變量start來記錄某一層的其實位置,用cnt來記錄跟其實位置是否爲同一深度,cnt=0表示同一深度,因爲中間每段都是由逗號隔開,因此當咱們判斷當cnt爲0,且當前字符是逗號或者已經到字符串末尾了,咱們把start到當前位置之間的字符串取出來遞歸調用函數,把返回結果加入res中,而後start更新爲i+1。若是遇到'[',計數器cnt自增1,若遇到']',計數器cnt自減1。參見代碼以下:post

 

解法一:url

class Solution {
public:
    NestedInteger deserialize(string s) {
        if (s.empty()) return NestedInteger();
        if (s[0] != '[') return NestedInteger(stoi(s));
        if (s.size() <= 2) return NestedInteger();
        NestedInteger res;
        int start = 1, cnt = 0;
        for (int i = 1; i < s.size(); ++i) {
            if (cnt == 0 && (s[i] == ',' || i == s.size() - 1)) {
                res.add(deserialize(s.substr(start, i - start)));
                start = i + 1;
            } else if (s[i] == '[') ++cnt;
            else if (s[i] == ']') --cnt;
        }
        return res;
    }
};

 

咱們也能夠使用迭代的方法來作,這樣就須要使用棧來輔助,變量start記錄起始位置,咱們遍歷字符串,若是遇到'[',咱們給棧中加上一個空的NestInteger,若是遇到的字符數逗號或者']',若是i>start,那麼咱們給棧頂元素調用add來新加一個NestInteger,初始化參數傳入start到i之間的子字符串轉爲的整數,而後更新start=i+1,當遇到的']'時,若是此時棧中元素多於1個,那麼咱們將棧頂元素取出,加入新的棧頂元素中經過調用add函數,參見代碼以下:
 
解法二:
class Solution {
public:
    NestedInteger deserialize(string s) {
        if (s.empty()) return NestedInteger();
        if (s[0] != '[') return NestedInteger(stoi(s));
        stack<NestedInteger> st;
        int start = 1;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] == '[') {
                st.push(NestedInteger());
                start = i + 1;
            } else if (s[i] == ',' || s[i] == ']') {
                if (i > start) {
                    st.top().add(NestedInteger(stoi(s.substr(start, i - start))));
                }
                start = i + 1;
                if (s[i] == ']') {
                    if (st.size() > 1) {
                        NestedInteger t = st.top(); st.pop();
                        st.top().add(t);
                    }
                }
            }
        }
        return st.top();
    }
};

 

還有一種方法是利用C++ STL中的字符串流處理類istringstream,咱們須要對幾個函數有些瞭解,好比clear()是重置字符流中的字符串,get()是得到下一個字符,peek()是返回首字符,>>num是讀取出合法的整數,若是沒法讀取出整數,須要調用clear()來重置字符串,不然調用get()會出錯。思路跟上面的遞歸解法相同,參見代碼以下:spa

 

解法三:code

class Solution {
public:
    NestedInteger deserialize(string s) {
        istringstream in(s);
        return deserialize(in);
    }
    NestedInteger deserialize(istringstream& in) {
        int num;
        if (in >> num) return NestedInteger(num);
        in.clear();
        in.get();
        NestedInteger list;
        while (in.peek() != ']') {
            list.add(deserialize(in));
            if (in.peek() == ',') {
                in.get();
            }
        }
        in.get();
        return list;
    }
};

 

相似題目:orm

Nested List Weight Sum II

Flatten Nested List Iterator

Nested List Weight Sum

 

參考資料:

https://discuss.leetcode.com/topic/54258/python-c-solutions/3

https://discuss.leetcode.com/topic/54341/iterative-c-using-stack

https://discuss.leetcode.com/topic/54277/short-java-recursive-solution

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索