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
思路
方法一:首先判断字符串s
的第一个字符是否为数字或‘-’,如果是,则字符串仅包含数字,可以直接输出int(s)
。否则,该字符串为列表。此时就需要遍历字符串的所有字符,分类讨论。如果字符为[
,则需要先使用NestedInteger
创建一个空列表;如果字符为,
且前面一位为数字,则说明一个数字已经遍历结束,需要将其存入NestedInteger
中;如果字符为-
,则说明后面的数字是负数,保存时需要将其添加负号;如果字符为]
,且前面一位为数字,则说明一个数字遍历结束,且一个列表遍历结束,需要存在上一个创建的NestedInteger
中;如果是数字,则将curVal
再乘10的基础上加该数字。
由于涉及到频繁的数字、列表出入,因此可以将NestedInteger
放入一个栈中,最后弹出栈的最后一位即可。
代码
class Solution:
def deserialize(self, s: str) -> NestedInteger:
if s[0] != '[': return NestedInteger(int(s))
stack, curVal, sign = [], 0, False
for i, c in enumerate(s):
if c == '[': stack.append(NestedInteger())
elif c == '-': sign = True
elif c == ',':
if s[i-1].isdigit(): stack[-1].add(NestedInteger(-curVal if sign else curVal))
curVal, sign = 0, False
elif c == ']':
if s[i-1].isdigit(): stack[-1].add(NestedInteger(-curVal if sign else curVal))
if len(stack) > 1:
cur = stack.pop()
stack[-1].add(cur)
curVal, sign = 0, False
else:
curVal = curVal * 10 + int(c)
return stack.pop()