入门力扣自学笔记3 C++ (题目编号385)

385. 迷你语法分析器

题目:

给定一个字符串 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 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()函数是返回一个元素。

5.一般在vector中加入元素用push_back,在对象中加入字符串用add。

你可能感兴趣的:(力扣算法学习,算法,c++)