有效括号算法

原文地址:有效括号算法

题目:给定只包括 (、)、{、}、[、]的字符串,判断字符串是否有效,规则就是左括号须用相同类型右括号闭合,且以正确顺序闭合。

Leecode给出的案例如下所示:

# 示例一:输入:s = "()"输出:true# 示例二:输入:s = "()[]{}"输出:true# 示例三:输入:s = "(]"输出:false# 示例四:输入:s = "([)]"输出:false# 示例五:输入:s = "{[]}"输出:true

LeetCode截图如下:

解题思路如下:

  1. 思路一:存储左括号和右括号的映射,用栈统计左括号,出现左括号就入栈,出现右括号就和栈顶在 map中映射的右括号比较,如果匹配就出栈,不匹配返回 false,最后遍历完的栈为空,则返回 true,否则返回 false。

  2. 思路二:对于给定的字符串 s ,如果有成对出现的括号,则把它们消去(替换为空),再依次判断是否还有成对的括号,有则消去,直到没有成对的括号出现为止,最后判断字符串 s 是否为空,为空则所有括号都正确成对,已被消去,返回true,不为空则说明存在非法括号,返回 false。

首先就得有两个验证,一是判断长度是否非空,如果为空,则返回true,二是判断长度是否为偶数,如果不是偶数,那么肯定不能成对匹配,总会剩下一个字符,此时的字符就是无效的。

来看代码示例:

# 思路一func isValid(s string) bool {
   
     m := map[byte]byte{'{': '}', '[': ']', '(': ')'}  var stack []byte  for i := 0; i < len(s); i++ {
   
       if _, ok := m[s[i]]; ok {
   
         stack = append(stack, s[i])    } else {
   
         if len(stack) > 0 && m[stack[len(stack)-1]] == s[i] {
   
           stack = stack[:len(stack)-1]      } else {
   
           return false      }    }  }  return len(stack) == 0}# 思路二func isValid(s string) bool {
   
     for {
   
       find1 := strings.Contains(s, "()")    find2 := strings.Contains(s, "[]")    find3 := strings.Contains(s, "{}")    if find1 || find2 || find3 {
   
         s = strings.Replace(s, "()", "", -1)      s = strings.Replace(s, "[]", "", -1)      s = strings.Replace(s, "{}", "", -1)    } else {
   
         break    }  }  return len(s) == 0}

至此,本次分享就结束了,后期会慢慢补充的。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

以上均为个人认知,如有侵权,请联系删除。

  

Guess you like

Origin blog.csdn.net/luyaran/article/details/121300863