20. 有效的括号
题目:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
链接 https://leetcode.cn/problems/valid-parentheses/
个人思路
- 一开始想到,有效的括号存在一个特点,就是最右边的左括号其右边必然为其右括号,所以只需要找到最右边的左括号的位置(rfind函数),接着判断其右边是否为其右括号即可,不是则直接返回false,否则replace后接着判断
class Solution:
def isValid(self, s: str) -> bool:
# while (len(s)) > 1:
# brackets1 = s.rfind('(')
# brackets2 = s.rfind('[')
# brackets3 = s.rfind('{')
# maxBrackets = max(brackets1,brackets2,brackets3)
# if maxBrackets == len(s) - 1:
# return False
# if brackets1 == maxBrackets:
# if s[maxBrackets + 1] == ')':
# s = s.
- 写到一半后发现为什么不直接把最小的括号都replace呢,于是有了下面的题解:
(不得不说,python的函数方法真的多)
class Solution:
def isValid(self, s: str) -> bool:
sLen = len(s)
while sLen>0:
s = s.replace('()','')
s = s.replace('[]','')
s = s.replace('{}','')
# 如果替换前后字符长度不变说明没有有效括号
if sLen == len(s):
return False
sLen = len(s)
return True
但用时较长,看了别人的思路才发现,这里应该是考察栈的应用
复杂度分析
时间复杂度:略
空间复杂度:略
其他思路
在Python中,None、False、空字符串""、0、空列表[]、空字典{}、空元组()都相当于False
def isValid(self, s: str) -> bool:
match_dic = {')':'(', ']':'[', '}':'{'}
temp_list = []
for ch in s:
if ch in '([{':
temp_list.append(ch)
elif ch in ')]}':
# 右括号比左括号先出现, 不能闭合
if not temp_list:
return False
# 遇到右括号, 必然要与上一个左括号闭合, 如果不匹配就 False
if match_dic[ch] == temp_list[-1]:
temp_list.pop(-1)
else:
return False
# 正常闭合的情况下, 栈里面应该全都弹出去了, 所以应该是空的
if not temp_list:
return True
else:
return False
复杂度分析
时间复杂度:O(N)。遍历了一遍字符串。
空间复杂度:O(N)。最坏情况下,假如输入是 (((((((,栈的大小将是输入字符串的长度。
作者:z1m
链接:https://leetcode.cn/problems/valid-parentheses/solution/zhu-bu-fen-xi-tu-jie-zhan-zhan-shi-zui-biao-zhun-d/
来源:力扣(LeetCode)