leetcode-每日一题2022.4.15 迷你语法分析器

题目

力扣

思路 栈

每个[都意味着一个实例的存在,每个元素都属于左边最近一个实例。用实例类型的栈来处理。遍历字符串:

  • ,:跳过。

  • -或数字:获取代表数值的连续字符,并创建数值型实例压入栈中。

  • [:创建一个实例压入栈中,并压入一个标识开始的实例。

  • ]:从栈中取出元素,直到遇到标识开始的实例。将[和]之间的所有元素添加到[所代指的嵌套实例中,再将[所指代的实例放入栈中。

代码

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);
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值