原文地址:有效括号算法
题目:给定只包括 (、)、{、}、[、]的字符串,判断字符串是否有效,规则就是左括号须用相同类型右括号闭合,且以正确顺序闭合。
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 []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
}
至此,本次分享就结束了,后期会慢慢补充的。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
以上均为个人认知,如有侵权,请联系删除。