题目
思路 栈
每个[都意味着一个实例的存在,每个元素都属于左边最近一个实例。用实例类型的栈来处理。遍历字符串:
-
,:跳过。
-
-或数字:获取代表数值的连续字符,并创建数值型实例压入栈中。
-
[:创建一个实例压入栈中,并压入一个标识开始的实例。
-
]:从栈中取出元素,直到遇到标识开始的实例。将[和]之间的所有元素添加到[所代指的嵌套实例中,再将[所指代的实例放入栈中。
代码
class Solution {
public:
NestedInteger* start = new NestedInteger(0);
NestedInteger deserialize(string s) {
stack<NestedInteger*> stack;
int n = s.size(), i = 0;
while(i < n){
if(s[i] == ','){
i++;
}else if(s[i] == '-' || (s[i] >= '0' && s[i] <= '9')){
int j = s[i] == '-' ? i + 1 : i, num = 0;
while(j < n && s[j] >= '0' && s[j] <= '9'){
num = num * 10 + s[j++] - '0';
}
stack.push(new NestedInteger(s[i] == '-' ? -num : num));
i = j;
}else if(s[i] == '['){
stack.push(new NestedInteger());
stack.push(start);
i++;
}else{
vector<NestedInteger*> v;
while(!stack.empty()){
NestedInteger* cur = stack.top();
stack.pop();
if(cur == start) break;
v.push_back(cur);
}
for(int j = v.size() - 1; j >= 0; j--){
stack.top()->add(*(v[j]));
}
i++;
}
}
return *stack.top();
}
};
思路 DFS
一个NestedInteger实例只能包含两部分之一:整数;列表,列表中每个元素都是一个Nestedinteger实例。因此可以通过递归法来解析。从左到右遍历s。如果第一位是[,说明待解析的是一个列表,则调用解析函数解析列表中的元素。调用结束后如果遇到的是,字符,则表示列表中还有其他元素,需要继续调用。如果是]元素,则表示这个列表已经解析完毕,可以返回NestedInteger实例。否则,则表示待解析的NestedInteger只包含一个整数,可以从左到右解析这个整数,要注意负号的存在,直到遍历完或者遇到非数字字符,并返回NestedInteger实例。这里的递归的参数传递没有指定边界,如果碰到了对应字符就表示本层递归结束,所以index是全局变量。
代码
class Solution {
public:
int index = 0;
NestedInteger deserialize(string s) {
if(s[index] == '['){
index++;
NestedInteger ni;
while(s[index] != ']'){
ni.add(deserialize(s));
if(s[index] == ',')
index++;
}
index++;
return ni;
}else{
bool negetive = false;
if(s[index] == '-'){
negetive = true;
index++;
}
int num = 0;
while(index < s.size() && isdigit(s[index])){
num = num * 10 + s[index++] - '0';
}
return NestedInteger(negetive ? -num : num);
}
}
};