题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
思路
1)用collections.defaultdict(str)构建一个字典【一定要用这个】且字典的key是右括号
2)构建一个辅助栈
3)遍历字符串,如果栈中没有值,就进入栈
4)如果有值,去查字典,如果新进来的字符和栈顶对应字典里的value一样的话,就消除【消消乐】
5)不一样,就入栈
6)最后栈空则为有效,否则为无效
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
kh_dict = collections.defaultdict(str) # 一定得用这个字典设置,遇到没有见过的会自动加入到字典里
kh_dict[')'] = '('
kh_dict[']'] = '['
kh_dict['}'] = '{'
stack = []
s=list(s)
i=0
while i<len(s):
if stack:
tmp = stack[-1]
if kh_dict[s[i]]==tmp:
i+=1
stack.pop(-1)
else:
stack.append(s[i])
i+=1
else:
stack.append(s[i])
i+=1
return True if not stack else False