题目:
给定一个只包含"(", “)”, ”[“,”]“, ”{“, "}"的字符串,判断字符串是否有效,有效字符串需要满足:
左括号必须用相同类型的右括号闭合;
左括号必须以正确的顺序闭合。
例子:
输入:{}{}[]
输出:true
输入:{[}{]}
输出:false
输入:{[()]}
输出:true
刚刚看到题的时候,感觉还是挺复杂的,不过动手画一画,就能发现正确的字符串是有规律的。什么规律呢?
- 先有左括号,再有相应的右括号(也就是说,不能凭空出现一个右括号,而前面没有相应的左括号)
- 从左往右遍历字符串,如果遇到左括号,我们暂时还不能判断,一旦出现右括号,那么它必须与最近的一个没有被匹配过的左括号匹配,否则字符串就出错
- 到了最后,左右括号应当全部匹配完
python 代码如下:
def isValid(s):
stack = []
dict = {'[':']', '{',:'}', '(':')'}
for c in s:
if c in dict.values():
stack.append(c)
elif c in dict.keys():
if stack==[] or dict[c]!=stack.pop():
return False
else:
return False
return stack==[]
代码比较简单,这里就不再举相亲的例子,只是简要介绍一个流程:
主要进程是一个遍历,另有一个数组用来存储。
每次遇到一个左括号我们就把它放到数组stack中,如果遇到右括号,我们就需要判断一下了:
首先判断用来存储的数组是不是为空,如果为空,那自然就没有相应的左括号了;也判断这个数组的最后一个元素是不是和当前遇到的右括号匹配,如果不匹配,那也可以直接输出False了,如果匹配,那就去掉数组里最后这个左括号,因为它已经被匹配掉了。
到了最后,我们再判断用来存储的数组是否为空,如果为空,那么说明左右括号都刚好被匹配完,输出True,如果不为空,那就是有问题。
再强调一遍,这个题的题眼在于:
如果遇到右括号,那么它必须与最近的一个没有被匹配过的左括号匹配。
更多算法文章:
不含重复项的最长子串
相亲问题
小偷问题
合并问题