https://leetcode.com/problems/mini-parser/code
遞歸作法:不斷找出一個完整的nested integer字符串,解析出來並add進NestedInteger結構。遞歸
一個完整的nested integer字符串有如下兩種狀況:leetcode
[]
包裹,形如 "123", "456" 的形式[]
包裹,形如 "[123, 456 , [], 789]" 的形式兩種狀況分別處理便可。字符串
class Solution { public: NestedInteger deserialize(string s) { if (s.empty()) return NestedInteger(); if (s[0] != '[') return NestedInteger(stoi(s)); NestedInteger ret; int pos = 1; if (s[pos] == ']') return ret; while (pos < s.size()) { int start = pos, end = pos; if (s[start] != '[') { while (end < s.size() && s[end] != ',' && s[end] != ']') end++; } else { int match = 1; end++; while (match != 0) { if (s[end] == '[') match++; if (s[end] == ']') match--; end++; } } if (s[start] != '[') { ret.add( NestedInteger(stoi(s.substr(start, end-start))) ); } else { ret.add( deserialize(s.substr(start, end-start)) ); } pos = end + 1; } return ret; } };
更清晰的寫法:get
class Solution { public: NestedInteger deserialize(string s) { if (s.empty()) return NestedInteger(); if (s[0] != '[') return NestedInteger(stoi(s)); NestedInteger ret; int pos = 1; if (s[pos] == ']') return ret; while (pos < s.size()) { int start = pos, end = pos; string str = extract(s, start, end); if (s[start] != '[') { ret.add( NestedInteger(stoi(str)) ); } else { ret.add ( deserialize(str) ); } pos = end + 1; } return ret; } string extract(string& s, int& start, int& end) { if (s[start] != '[') { while (end < s.size() && s[end] != ',' && s[end] != ']') end++; } else { int match = 1; end++; while (match != 0) { if (s[end] == '[') match++; if (s[end] == ']') match--; end++; } } return s.substr(start, end - start); } };