题目:
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。
列表中的每个元素只可能是整数或整数嵌套列表
示例 1:
输入:s = "324",
输出:324
解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。
示例 2:
输入:s = "[123,[456,[789]]]",
输出:[123,[456,[789]]]
解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
i. 一个 integer 包含值 456
ii. 一个包含一个元素的嵌套列表
a. 一个 integer 包含值 789
提示:
1 <= s.length <= 5 * 104
s 由数字、方括号 "[]"、负号 '-' 、逗号 ','组成
用例保证 s 是可解析的 NestedInteger
输入中的所有值的范围是 [-106, 106]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/mini-parser
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
首先定义一个vector,类型为NestedInteger,用来存储字符串,目的是为了最后的返回。
当为‘[’字符的时候,就在v中加入一个NestedInteger。
当为‘,’字符的时候,判断curr字符串是不是空的,如果不是空,证明他就是一个完整的字符串,那么将这个字符串加入到最后的NestedInteger中。
当为‘]’字符的时候,同理要先判断curr字符串是不是空,不是空的话,证明就是一个完整的字符串,那么加入到最后的NestedInteger中。在这里,还要判断整体vector的大小,如果这个size大于1的话,证明有两个NestedInteger,而且最后的这个NestedInteger是属于上一个NestedInteger的,那么要将最后的NestedInteger加入到上一个NestedInteger中。
当为其他字符的时候,证明就是一个单纯的字符数字,那么需要将这个先保存到curr字符串中,方便最后将整体的curr加入到NestedInteger中。
代码:
class Solution {
public:
NestedInteger deserialize(string s) {
vector<NestedInteger> v;
string curr="";
for(char c:s)
{
if(c == '[')
{
v.push_back(NestedInteger());
}
else if(c == ',')
{
if(!curr.empty())
{
v.back().add(stoi(curr));
curr.clear();
}
}
else if(c == ']')
{
if(!curr.empty())
{
v.back().add(stoi(curr));
curr.clear();
}
//考虑是不是要加入要上一个NestedInteger中
if(v.size() > 1)
{
NestedInteger back = v.back();
v.pop_back();
v.back().add(back);
}
}
else
{
curr.append(1,c);
}
}
//边缘情况
if(!curr.empty())
{
v.push_back(NestedInteger(stoi(curr)));
}
return v.back();
}
};
注:
1.append函数
类似于尾插,在元素后面添加一个字符串。
curr.append(1,c);题目中的这个,意思是插入1个c。这里的c可以替换成字符串或者字符,比如换成curr.append(6,‘a’);,那么意思就是插入6个a。
2.stoi函数
stoi(字符串,起始位置,2~32进制),将n进制的字符串转化为十进制。(没有太大作用,而且好像还不是标准库,一般用不到,见一次就好)
3.边缘情况
这个题目要考虑最后如果没有‘]’字符,而且curr也不是空的,那么就将curr全部放入最后的NestedInteger中。
4.push_back()函数和back()函数
push_back()函数是在其中加入一个元素。
back()函数是返回一个元素。