题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
输入:s = "()"
输出:true
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
栈
'()[]'和'([])'这两种有效情况,可以看出,只要右括号前面是左括号,它们一定是一对,可以相互抵消的。
利用栈的思想可以很好的解决题目,有种消消乐的感觉。
def isValid(s):
# 如果字符串是奇数,那么肯定返回False
if len(s)%2!=0:
return False
hash = {
')':'(',
']':'[',
'}':'{'
}
stack = []
for ch in s:
# 如果是右括号
if ch in hash:
# 如果已经空栈且右括号,直接False
# 如果栈顶的左括号和当前右括号不配对,直接False
if not stack or stack[-1]!=hash[ch]:
return False
# 没空栈,且与栈顶左括号配对,则消除这对括号
stack.pop()
else:
# 如果是左括号,直接入栈
stack.append(ch)
# 经过栈的消除,如果是有效括号,应该是空栈
return not stack
时间复杂度:O(n)
空间复杂度:O(n+∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含6种括号,∣Σ∣=6。栈中的字符数量为 O(n),而哈希表使用的空间为 O(∣Σ∣),相加即可得到总空间复杂度。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。