描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
数据范围:字符串长度 0≤𝑛≤10000
要求:空间复杂度 𝑂(𝑛),时间复杂度 𝑂(𝑛)
示例1
输入:"["
返回值:false
示例2
输入:"[]"
返回值:true
栈+字典
class Solution:
# 定义一个方法,用于判断括号字符串是否有效
def isValid(self, s: str) -> bool:
# 初始化一个空栈,用于存储左括号
stack = []
# 定义一个字典,存储右括号与左括号的映射关系
mapping = {")": "(", "}": "{", "]": "["}
# 遍历字符串s中的每个字符
for char in s:
# 如果字符是左括号,压入栈中
if char in "([{":
stack.append(char)
# 如果字符是右括号
else:
# 如果栈为空,说明右括号没有匹配的左括号,返回False
if not stack:
return False
# 如果栈顶元素与当前右括号匹配,弹出栈顶元素
if stack[-1] == mapping[char]:
stack.pop()
# 如果不匹配,返回False
else:
return False
# 如果栈为空,说明所有括号都匹配,返回True,否则返回False
return not stack
栈
1.栈的特点:后入先出,实际上就是对顺序表和链表的进一步封装。栈可以用顺序表表示,也可以用链表表示。
2.用顺序表构造栈:方法一:在线性表头部添加元素,并在头部取出元素,因为所有元素都要移动位置,相应的时间复杂度为O(n);方法二:在线性表尾部添加元素,并在尾部取出元素,相应的时间复杂度为O(1)。因此,选用方法二。
用链表构造栈:方法一:在链表头部添加元素,并在头部取出元素,相应的时间复杂度为O(1);方法二:在链表尾部添加元素,并在尾部取出元素,因为要遍历整个链表,相应的时间复杂度为O(n)。因此,选用方法一。
3.关于栈的操作:添加元素、弹出栈顶元素、返回栈顶元素、判断是否为空、计算元素个数。
class Stack(object):
def __init__(self):
#设置一个列表
self.__items = []
def push(self,item):
#添加元素
self.__items.append(item)
def pop(item):
#弹出栈顶元素
return self.__items.pop()
def peek(self):
#返回栈顶元素
return self.__items[-1]
def is_empty(self):
#判断是否为空
return self.items == []
def length(self):
#计算栈中元素个数
return len(self.items)
使用替换对比法
class Solution:
# 定义一个方法,用于判断括号字符串是否有效
def isValid(self, s: str) -> bool:
# 无限循环,直到字符串为空或没有更多可替换的括号对
while True:
# 保存当前字符串的原始状态
ori = s
# 依次替换所有的 "()", "{}" 和 "[]"
s = s.replace("()", "").replace("{}", "").replace("[]", "")
# 如果字符串为空,说明所有括号都匹配,返回True
if not s:
return True
# 如果字符串没有变化,说明没有更多的括号对可替换,返回False
if s == ori:
return False
repalce函数
语法
replace() 函数是 Python 字符串对象的内置方法之一,用于将字符串中的指定子串替换为新的子串。
str.replace(old, new[, count])
参数
old:需要被替换的旧子串。
new:替换后的新子串。
count(可选):指定替换的次数。如果不指定,则会替换所有匹配的子串。
返回值
replace() 函数返回一个新的字符串,其中的旧子串已被替换为新子串。