20.有效的括号
练习次数 *
https://leetcode.cn/problems/valid-parentheses/
20. 有效的括号
简单 │ 4519 │ 44.1% 的 4.3M │ 提示
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。
3. 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
提示:
* 1 <= s.length <= 10^4
* s 仅由括号 '()[]{}' 组成
解法
// @leet start
func isValid(s string) bool {
stack := Stack{}
for _, v := range s {
switch v {
case '(':
stack.Push(v)
break
case ')':
if x, ok := stack.Peek(); ok && x == '(' {
stack.Pop()
} else {
return false
}
break
case '[':
stack.Push(v)
break
case ']':
if x, ok := stack.Peek(); ok && x == '[' {
stack.Pop()
} else {
return false
}
break
case '{':
stack.Push(v)
break
case '}':
if x, ok := stack.Peek(); ok && x == '{' {
stack.Pop()
} else {
return false
}
break
}
}
return stack.Empty()
}
type Stack struct {
inner []rune
}
func (s *Stack) Empty() bool {
return len(s.inner) == 0
}
func (s *Stack) Push(x rune) {
s.inner = append(s.inner, x)
}
func (s *Stack) Pop() (rune, bool) {
if len(s.inner) == 0 {
return ' ', false
}
x := s.inner[len(s.inner)-1]
s.inner = s.inner[:len(s.inner)-1]
return x, true
}
func (s *Stack) Peek() (rune, bool) {
x, ok := s.Pop()
if !ok {
return ' ', false
}
s.Push(x)
return x, ok
}
// @leet end