给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
参考:
- https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
复杂度分析: - 时间复杂度:O(n)O(n),其中 nn 是字符串 ss 的长度。
- 空间复杂度:O(n + |Sigma|)O(n+∣Σ∣),其中 SigmaΣ 表示字符集,本题中字符串只包含 66 种括号,|Sigma| = 6∣Σ∣=6。栈中的字符数量为 O(n)O(n),而哈希表使用的空间为 O(|Sigma|)O(∣Σ∣),相加即可得到总空间复杂度。
python
# 0020.有效括号
class Solution:
def validParentheses(self, s: str) -> bool:
"""
哈希存储括号,key-右括号,val-左括号,栈存储左括号匹配
思路:
- 如果空或第一个元素即为右括号或者长度小于2,直接返回fasle
- 遍历字符,栈非空且字符在字典中,
- 如果栈顶元素与p中val匹配,弹栈
- 否则,入栈
- 遍历结束后,如果有效括号,肯定栈空,否则栈中有值,返回bool
:param s:
:return:
"""
p = {
"}": "{",
"]": "[",
")": "("
}
stack = []
if not s or s[0] in p or len(s) < 2:
return False
for str in s:
if stack and str in p:
if stack[-1] == p[str]:
stack.pop()
else:
return False
else:
stack.append(str)
return not stack
golang
package main
func isValid(s string) bool {
var n int = len(s)
if n%2 == 1 {
return false
}
var pairs = map[byte]byte{
')': '(',
']': '[',
'}': '{',
}
var stack = []byte{}
for i := 0; i < n; i++ {
if pairs[s[i]] > 0 { // 右括号时
if len(stack) == 0 || stack[len(stack)-1] != pairs[s[i]] { // stack空或者栈顶与pairs的key不匹配,fasle
return false
}
stack = stack[:len(stack)-1] // stack非空且匹配左右括号,弹栈
} else {
stack = append(stack, s[i]) // 左括号时,入栈
}
}
}