题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一(暴力去除法)
- 思路
循环将字符串中相邻且配对的括号去掉
直到不能再找到这样配对的括号(算法中表现为两次循环中字符串长度相同)
最后,若字符串为空,返回True;否则返回False
p.s. 若开始时字符串长度为奇数,则可直接返回False - 代码
class Solution:
def isValid(self, s: str) -> bool:
lens=len(s)+1
if lens%2==0:
return False
while(True):
if len(s)<lens:
lens=len(s)
else: break
s=s.replace("()",'')
s=s.replace("{}",'')
s=s.replace("[]",'')
return True if s=='' else False
- 结果
解法二(栈)
- 思路
定义一个res(list)作为一个栈
遍历整个字符串,将每个左括号加入res
当发现右括号时,就查栈顶元素:
若不是其对应的左括号,直接返回False;
若是,该元素出栈,检查字符串中下一个元素。
p.s.
我这里判断括号是否对应用的是ASCII码的方式
ord(char)取ASCII码
Dec(十进制) | 缩写 | 字符解释 |
---|---|---|
40 | ( | 开括号 |
41 | ) | 闭括号 |
63 | ? | 问号 |
91 | [ | 开方括号 |
93 | ] | 闭方括号 |
123 | { | 开花括号 |
125 | } | 闭花括号 |
观察上表可知,对应括号之间的ASCII码相差1或者2
且’?'与他们都不相近,所以可用于填充空栈
- 代码
class Solution:
def isValid(self, s: str) -> bool:
res=['?']
i,lens=0,len(s)
if lens%2==1:
return False
while(i<lens):
c=s[i]
if c==')' or c=='}' or c==']':
if ord(res[-1])==ord(c)-1 or ord(res[-1])==ord(c)-2:
del res[-1]
else:
return False
else:
res.append(c)
i+=1
return True if res==['?'] else False
- 结果