美文网首页leetcode算法
385. 迷你语法分析器-每日一题

385. 迷你语法分析器-每日一题

作者: 刘翊扬 | 来源:发表于2022-04-15 23:16 被阅读0次

给定一个字符串 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]

思路:

从左至右遍历 ss,如果遇到 ‘[’,则表示是一个新的 NestedInteger 实例,需要将其入栈。如果遇到 '} 或 ‘,’,则表示是一个数字或者 NestedInteger 实例的结束,需要将其添加入栈顶的 NestedInteger 实例。最后需返回栈顶的实例。

方法一:使用栈

/**
     * NestedInteger(序列):{
     *     NestedInteger(数字):1
     *     NestedInteger(序列):{
     *         NestedInteger(数字):2
     *         NestedInteger(数字):3
     *     }
     *     NestedInteger(数字):4
     * }
     * @param s
     * @return
     */
    public NestedInteger deserialize(String s) {
        if (s.charAt(0) != '[') {
            return new NestedInteger(Integer.parseInt(s));
        }
        Deque<NestedInteger> stack = new ArrayDeque<>();
        int num = 0;
        boolean negative = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '-') {
                negative = true;
            } else if (Character.isDigit(c)) {
                num = num * 10 + c - '0';
            } else if (c == '[') {
                stack.push(new NestedInteger());
            } else if (c == ',' || c == ']') {
                if (Character.isDigit(s.charAt(i - 1))) {
                    if (negative) {
                        num *= -1;
                    }
                    stack.peek().add(new NestedInteger(num));
                }
                num = 0;
                negative = false;
                if (c == ']' && stack.size() > 1) {
                    NestedInteger ni = stack.pop();
                    stack.peek().add(ni);
                }
            }
        }
        return stack.pop();
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/mini-parser
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

相关文章

  • 3.栈(三)

    题目汇总:https://leetcode-cn.com/tag/stack/385. 迷你语法分析器中等(不做)...

  • 385. 迷你语法分析器-每日一题

    给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger ...

  • 385. 迷你语法分析器(Python)

    题目 难度:★★★☆☆类型:数据结构方法:考虑周全 传送门 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的...

  • Go&Java算法之迷你语法分析器

    迷你语法分析器 给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 Nested...

  • PHP核心理解-flex和bison入门

    一般词法分析器和语法分析器会一起使用,语法分析器会调用词法分析器来读取输入,词法分析器匹配到特定的模式后,就向语法...

  • 语法分析器 Parser

    词法分析器-->output: 记号 --> 语法分析器 -->output: AST 抽象语法树 context...

  • 编译原理笔记7:语法分析(1)语法分析器的任务、语法错误的处理

    语法分析器是编译器前端的核心 语法分析器的两项主要任务,分别: 是根据词法分析器提供的记号流,为语法正确的输入构造...

  • 编译原理——语法分析小结(1~3)

    1、语法分析器的作用 语法分析器接收词法分析器提供的记号串,检查它们是否能由源程序语言的文法产生。 典型的...

  • 词法分析任务

    词法分析任务 字符流到记号流的转换 可以将整个流程展示如下图: 源程序>词法分析器>记号流>语法分析器>抽象语法树...

  • 栈-N385-迷你语法分析器

    题目 概述:给定一个用字符串表示的整数的嵌套列表,列表中的每个元素只能是整数或者整数嵌套列表,实现一个解析它的语法...

网友评论

    本文标题:385. 迷你语法分析器-每日一题

    本文链接:https://www.haomeiwen.com/subject/xlfcertx.html