Java实现 LeetCode 385 迷你语法分析器

385. 迷你语法分析器

给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。

列表中的每个元素只可能是整数或整数嵌套列表

提示:你可以假定这些字符串都是格式良好的:

字符串非空
字符串不包含空格
字符串只包含数字0-9, [, - , ]

示例 1:

给定 s = "324",

你应该返回一个 NestedInteger 对象,其中只包含整数值 324

示例 2:

给定 s = "[123,[456,[789]]]",

返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:

1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
    i.  一个 integer 包含值 456
    ii. 一个包含一个元素的嵌套列表
         a. 一个 integer 包含值 789
/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * public interface NestedInteger {
 *     // Constructor initializes an empty nested list.
 *     public NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     public NestedInteger(int value);
 *
 *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
 *     public boolean isInteger();
 *
 *     // @return the single integer that this NestedInteger holds, if it holds a single integer
 *     // Return null if this NestedInteger holds a nested list
 *     public Integer getInteger();
 *
 *     // Set this NestedInteger to hold a single integer.
 *     public void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     public void add(NestedInteger ni);
 *
 *     // @return the nested list that this NestedInteger holds, if it holds a nested list
 *     // Return null if this NestedInteger holds a single integer
 *     public List<NestedInteger> getList();
 * }
 */
class Solution {
      public NestedInteger deserialize(String s) {
        if(s.charAt(0)!='[') {
            return new NestedInteger(Integer.valueOf(s));
        }
        else {
            return deserialize1(s.substring(1));
        }
    }

    public NestedInteger deserialize1(String s) {
        NestedInteger res = new NestedInteger();
        //从左到右扫描
        for(int i=0;i<s.length();i++) {
            char c = s.charAt(i);
            if(c>='0'&&c<='9'||c=='-') {
                int n = 0; int flag = 1;
                for(;i<s.length();i++) {
                    c = s.charAt(i);
                    if(c>='0'&&c<='9') {
                        n = n*10 + c-'0';
                    } else if(c=='-'){
                        flag = -1;
                    } else {
                        i = i-1;
                        break;
                    }
                }
                res.add(new NestedInteger(flag*n));
            }
            else if(c=='[') {
                int index = i;
                int counter = 0;
                for(;i<s.length();i++) {
                    c = s.charAt(i);
                    if(c=='[') counter++;
                    else if(c==']') counter--;
                    if(counter==0) {
                        res.add(deserialize1(s.substring(index+1,i)));
                        break;
                    }
                }
            }
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/13075773.html