题目及要求:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
思路:
扫描二维码关注公众号,回复:
2623116 查看本文章
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值得意义,在之后的编程中也会很有用。
最后还是发个图,