Robin Harcker

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