有效括号算法

161 篇文章 12 订阅

原文地址:有效括号算法

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

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}

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

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

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

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

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值