美文网首页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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    相关文章

      网友评论

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

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