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
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 II,Flatten 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; } };
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
參考資料:
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