Python学习日记014——有效的括号
题目来源:LeetCode题库——有效的括号
给定一个只包括 ‘(’ , ‘)’ , ‘[’ , ‘]’ , ‘{’ , ‘}’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
Example1:
输入: “()”
输出: true
Example2:
输入: “()[]{}”
输出: true
Example3:
输入: “(]”
输出: false
Example4:
输入: “([)]”
输出: false
Example5:
输入: “{[]}”
输出: true
链接:https://leetcode-cn.com/problems/valid-parentheses
有效的括号
对于这个问题,我们可以首先将其分为两大模块考虑。一个是空字符串,一个是非空字符串。对于空字符串,返回为true。
而对于非空字符串,我们可以通过“栈”的思想,建立一个新的数组,将字符串中的元素依次添加到数组中,每添加一次,就判断其是否含有“有效的括号“:如果不含“有效的括号“,那么继续添加。如果含“有效的括号”,则先将这一对有效的括号删除掉,然后再继续添加。
如果最后这个数组为空数组,那么说明所有括号都找到了与之可以按照法则配对的另一半括号,则该字符串有效,返回 true 。如果最后这个数组不是空数组,那么说明有括号没有按照法则配对成功,返回 false 。
具体实现过程如下:
class Solution:
def isValid(self, s: str) -> bool:
if len(s) == 0: #空字符串
return True
else: #非空字符串
tem = [s[0]] #原始数组中包含字符串的第一个元素
j = 0 #变量j作为指针用来控制比较位的移动
for i in range(1,len(s)):
if len(tem) >= 1:
tem.append(s[i]) #将字符串的元素依次添加到数组中
if tem[j] == "(" and tem[j+1] == ")":
tem.pop() #对于满足配对法则的括号,将其删除
tem.pop() #删除是要删除一对括号
j -= 1 #删除后,比较位需要前移来开始下一轮的比较
if j < 0: #比较位的最小位置为0位置
j = 0
elif tem[j] == "[" and tem[j+1] == "]":
tem.pop()
tem.pop()
j -= 1
if j < 0:
j = 0
elif tem[j] == "{" and tem[j+1] == "}":
tem.pop()
tem.pop()
j -= 1
if j < 0:
j = 0
else:
j += 1
else:
tem.append(s[i])
continue
if tem == []: #若为空数组,说明该字符串内的括号均为有效括号
return True
else:
return False
其中最内层的 if 、elif 、elif 控制语句的三个条件可以合并写为:
if (tem[j] == "(" and tem[j+1] == ")") or (tem[j] == "[" and tem[j+1] == "]") or (tem[j] == "{" and tem[j+1] == "}"):
tem.pop()
tem.pop()
j -= 1
if j < 0:
j = 0
这里将控制条件分条展开描述笔者认为更易理解。
注
在力扣的评论区看到一种很简便的解法,和笔者的方法有异曲同工之处,但实现起来精简了非常多,在此呈现供学习参考:
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
学习过程中,欢迎指正。