20. 有效的括号
文章目录
-
- [20. 有效的括号(https://leetcode.cn/problems/valid-parentheses/)](#20. 有效的括号)
- ==思路==
- [- 栈](#- 栈)
- 总结
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
**输入:**s = "()"
**输出:**true
示例 2:
**输入:**s = "()\[\]{}"
**输出:**true
示例 3:
**输入:**s = "(]"
**输出:**false
示例 4:
**输入:**s = "(\[\])"
**输出:**true
示例 5:
**输入:**s = "()"
**输出:**false
思路
- 栈
-
我们对s遍历,使用一个栈记录,如果是左边的括号,那就直接入栈,如果是右边的括号,那就出栈,把当前出栈的元素和被遍历到的元素一起判断一下,如果是一对,那就继续,如果不是就直接返回false -
代码演示
go
//可以用函数比较,也可以用哈希表
func isValid(s string) bool {
pairs := map[rune]rune{
')': '(',
']': '[',
'}': '{',
}
stack := []rune{}
for _, v := range s {
if v == '(' || v == '[' || v == '{' {
stack = append(stack, v)
} else {
//判断,如果是stack的长度是0的时候还进入到了这一层,说明此时只有右括号,没有左括号,直接返回fasle即可
if len(stack) == 0 || stack[len(stack)-1] != pairs[v] {
return false
}
stack = stack[:len(stack)-1]
}
}
//这里思路很奇特,因为我们有可能碰到一种情况,就是s里面只有一个左括号,那我们在入栈之后就直接退出了,但是事实上还没有组成一个完整的括号,所以我们需要栈的长度判断是否等于0,这里直接把判断的返回值返回,非常简洁
return len(stack) == 0
}
go
if len(stack) == 0 || stack[len(stack)-1] != pairs[v] {
return false
}
//函数的话就是在判断是否可以组合为正确的括号时把两个参数穿进去判断
//函数的逻辑也很简单
//用函数的返回值判断,如果是false,那就直接返回fasle
if len(stack) == 0 || !compare(stack[len(stack)-1], v) {
return false
}
func compare(a, b rune) bool {
if a == '[' && b == ']' {
return true
} else if a == '(' && b == ')' {
return true
} else if a == '{' && b == '}' {
return true
} else {
return false
}
}
//优化一下代码
总结
本文是 《算法题目解析系列》 的第 26 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。