Skip to main content

385.Mini 解析器

标签: stack, string

难度: Medium

通过率: 39.26%

原题链接: https://leetcode.com/problems/mini-parser/description/

题目描述

给定一个字符串 s,表示嵌套列表的序列化,实现一个解析器来反序列化它,并返回反序列化的 NestedInteger。每个元素要么是整数,要么是一个其元素也可能是整数或其他列表的列表。

解题思路

题目要求解析一个嵌套列表的字符串表示,最后得到一个 NestedInteger 对象。字符串形式类似多层嵌套的 JSON 格式,可以通过遍历字符串逐字符解析。使用栈结构来辅助解析,通过一个栈来存储当前正在解析的 NestedInteger 对象。具体的解析流程如下:

  1. 如果字符是 [,那么新建一个新的 NestedInteger 对象,并将其推入栈中。
  2. 如果字符是 ],那么弹出栈顶的 NestedInteger 对象,并将其加入到新的栈顶对象中(如果栈非空的话)。
  3. 如果字符是数字或者是负号,则开始解析一个完整的数字,解析完后赋值给当前栈顶的 NestedInteger 对象。
  4. 如果字符是 ,,则跳过,因为逗号用于分隔不同元素,对嵌套结构无实际影响。

代码实现

class NestedInteger:
def __init__(self, value=None):
self.value = value if value is not None else []

def isInteger(self):
return isinstance(self.value, int)

def add(self, elem):
if not self.isInteger():
self.value.append(elem)

def setInteger(self, value):
self.value = value

def getInteger(self):
if self.isInteger():
return self.value
return None

def getList(self):
if not self.isInteger():
return self.value
return None

class Solution:
def deserialize(self, s: str) -> NestedInteger:
if not s:
return NestedInteger()

if s[0] != '[':
# if the string does not start with '[', it must be a single integer
return NestedInteger(int(s))

stack = []
current = None
start = 0 # start index for numbers within brackets

for i, char in enumerate(s):
if char == '[':
if current is not None:
stack.append(current)
current = NestedInteger()
start = i + 1
elif char == ']':
if s[start:i].strip(): # there's a number between this and last '[' or ','
current.add(NestedInteger(int(s[start:i])))
if stack:
last = stack.pop()
last.add(current)
current = last
start = i + 1
elif char == ',':
if s[start:i].strip():
current.add(NestedInteger(int(s[start:i])))
start = i + 1

return current

复杂度分析

时间复杂度:O(n)O(n),其中 nn 是字符串的长度,因为每个字符都被处理一次。

空间复杂度:O(n)O(n),用于存储栈中可能的嵌套结构,如果字符串含有深度嵌套,这可能达到完整的字符串长度。