[LeetCode][golang] 20. 有效的括号

383 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

1 <= s.length <= 10 的 4次方
s 仅由括号 '()[]{}' 组成

思路分析:

有两种思路。

  1. 一个是使用栈,遇到左边括号入栈,遇到对应的右边括号出栈,最后判断栈是否为空。
    该方法用上了数据结构,是相对高大上的方案。
  2. 因为字符串的值仅由括号 '()[]{}' 组成,所以也可以使用字符串替换。
    将字符串中所有的 () [] {} 无限循环替换,当替换前和替换后的长度不变时结束循环。
    然后判断最后的字符串是否为空,为空则有效,不为空则无效。

AC 代码:

golang :

// 有效的括号
func isValid(s string) bool {
   tmp := s
   
   // 无限循环
   for {
      // 替换前长度
      ln := len(tmp)

      // 对三种括号进行替换
      tmp = strings.ReplaceAll(tmp, "()", "")
      tmp = strings.ReplaceAll(tmp, "[]", "")
      tmp = strings.ReplaceAll(tmp, "{}", "")

      // 替换前后长度相同时,跳出循环
      if ln == len(tmp) {
         break
      }
   }

   // 替换后结果为空字符串,则返回 true ,否则返回 false 。
   if tmp == "" {
      return true
   }
   return false
}

总结:

字符串替换也仅适用于题目给出的条件。
如果字符串包含括号之外的字符,需要判断括号是否正确配对的话,只能使用第一种方案,然后忽略非括号就可以了。
不知道用正则表达式能不能实现,有时间再研究研究。