题目及要求:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
思路:
1.看到题目的时候首先想到的是键值对,将左括号和右括号连接起来,然后去遍历。
2.其次是将左右括号进行计数。(ps,尝试以后发现行不通)
3.然后将对应的括号的索引值标记出来。(后来也行不通)
尝试1:
def isValid(s):
list1=["(",")","{","}","[","]"]
list2=[]
if s[0]=="": return True
if s.count(list1[0]) != s.count(list1[1]): return False
if s.count(list1[2]) != s.count(list1[3]): return False
if s.count(list1[4]) != s.count(list1[5]): return False
for i in list1:
if i in s:
n=s.index(i)
if i in s[n+1:]:
n2=s[n+1:].index(i)
ls=[i,n,n2]
list2.append(ls)
n=len(list2)
for i in range(0,n-1,2):
if (list2[i+1][1]-list2[i][1])%2==1:
return True
else:
return False
以上代码最后是行不通的,之前也有含有字典的代码也是行不通的


然后实在是没有思路的,网络上搜索了一下,看到了这篇文章【leetcode】Python实现-20.有效的括号,根据里面的方法自己再尝试了一遍,有了如下代码,此代码运行可通过:
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
list1 = [None]
dict={'(':')','{':'}','[':']'}
if len(s)%2==1:return False
if s=="":return True
for i in s:
if i in dict:
list1.append(dict[i])#list1里面可能含有的值[')',']','}']
else:
if i not in list1:#如果‘)',']','}'不在里面,说明前面没有对应的'(','{','['
return False
else:
list1.pop(-1)
return len(list1)==1
最后把原文章大神的代码贴出来
a = {')': '(', ']': '[', '}': '{'}#固有思维是按照左括号对应右括号来写的,新思维可以反过来
l = [None] # 设置None是为了排除空值的情况!
for i in s:#大神的for以下的部分需要费点时间去理解
if i in a and a[i] == l[-1]:
l.pop()
else:
l.append(i)
return len(l) == 1
总结:
1.键值对做字典,除了惯例的‘(‘:’)’外,还可以反过来。
2.需要懂得s.pop的用法,这个在判断数据重复,及其他数据的判断上面很有帮助。
3.理解在list中添加None值得意义,在之后的编程中也会很有用。
最后还是发个图,



括号匹配算法解析

7万+

被折叠的 条评论
为什么被折叠?



