原文地址:有效括号算法
题目:给定只包括 (、)、{、}、[、]的字符串,判断字符串是否有效,规则就是左括号须用相同类型右括号闭合,且以正确顺序闭合。
Leecode给出的案例如下所示:
# 示例一:输入:s = "()"输出:true# 示例二:输入:s = "()[]{}"输出:true# 示例三:输入:s = "(]"输出:false# 示例四:输入:s = "([)]"输出:false# 示例五:输入:s = "{[]}"输出:true
LeetCode截图如下:

解题思路如下:
-
思路一:存储左括号和右括号的映射,用栈统计左括号,出现左括号就入栈,出现右括号就和栈顶在 map中映射的右括号比较,如果匹配就出栈,不匹配返回 false,最后遍历完的栈为空,则返回 true,否则返回 false。
-
思路二:对于给定的字符串 s ,如果有成对出现的括号,则把它们消去(替换为空),再依次判断是否还有成对的括号,有则消去,直到没有成对的括号出现为止,最后判断字符串 s 是否为空,为空则所有括号都正确成对,已被消去,返回true,不为空则说明存在非法括号,返回 false。
首先就得有两个验证,一是判断长度是否非空,如果为空,则返回true,二是判断长度是否为偶数,如果不是偶数,那么肯定不能成对匹配,总会剩下一个字符,此时的字符就是无效的。
来看代码示例:
# 思路一func isValid(s string) bool {m := map[byte]byte{'{': '}', '[': ']', '(': ')'}var stack []bytefor 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}
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
以上均为个人认知,如有侵权,请联系删除。

本文介绍了如何判断一个包含括号的字符串是否有效。主要提供了两种解题思路:一是利用映射和栈来检查括号匹配;二是通过消除成对括号来验证字符串是否为空。同时,给出了具体的Go语言实现代码。文章强调了检查字符串长度和奇偶性的重要性,并指出解题过程中的关键步骤。
91

被折叠的 条评论
为什么被折叠?



