leetcode 20 有效括号
示例:
给定大中小括号,判断字符串是否有效,
- 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。
输入: “()”
输出: true
输入: “(]”
输出: false
解题思路:
用stack来解决,常见解法。要留意的3个点:
- 左括号来了,那么直接push进去stack里
- 右括号来了,不能单独存在,需要匹配左括号,查看栈顶是否有与其匹配的左括号,若匹配了直接pop掉栈顶元素,不匹配就返回错误
- 如果整个字符串都正确,那么stack最后是空的
代码思路:
使用dict来存放括号的匹配模式,并且是用右括号作为key,左括号为value,好处是可以直接判断元素是否为右括号,elif是为右括号的话,栈顶元素是否匹配和栈是否为空,not关键词是一次判断,返回boolean值
代码:
class Solution:
def isValid(self, s: str) -> bool:
stack = []
patern_map = {']':'[',')':'(',"}":"{"}
for i in s:
if i not in patern_map: #不是右括号,key not in map
stack.append(i)
elif not stack or patern_map[i] != stack.pop(): #是右括号,与栈顶元素匹配,若为空或者不相等,则返回false
return False
return not stack ##判断是否为空,若为空,加上not,返回就是true
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 时间复杂度:每一次插入和删除操作都为O(1),每个元素只操作一次,一共n次,所以时间复杂度为O(n)
- 空间复杂度:最坏情况是所有元素压进stack里,所以是O(n)
进阶分析:
class Solution:
def isValid(self, s: str) -> bool:
while len(s) != 0:
s = s.replace("()","").replace("[]","").replace("{}","")
return len(s) == 0
上面这段代码是可行的,但是超出了限制时间,主要思想是,匹配括号,一匹配就换成空,直到字符串长度为0。
这里失败的原因是时间复杂度很高,replace操作的时间复杂度为O(N),最坏情况下会将此字符串扫描n次,且每次扫描的复杂度是o(n),所以总体复杂度在最坏情况下为 n^2