「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战」
刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能
有效的括号
题目来源:LeetCode-20. 有效的括号
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
示例
示例 1
输入:s = "()"
输出:true
示例 2
输入:s = "()[]{}"
输出:true
示例 3
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
解题
思路
这个可以用栈这种数据结构来解决。当遇到左括号,就将其压入到栈中,遇到右括号,则弹出栈顶元素与该右括号匹配,如果不能匹配,则不满足要求,如果匹配则继续遍历,直到遍历完字符串,且栈为空
不难想到第一个字符不应该是右括号,如果是右括号,肯定是不满足条件的。可以维护一个map,存储匹配的括号,key为右括号,value为左括号
- 如果遇到右括号,则取出栈顶元素进行比较
- 如果遇到左括号则压入栈中
代码
func IsValid(s string) bool {
n := len(s)
if n % 2 != 0 {
return false
}
mapBrackets := map[byte]byte{
')':'(',
']':'[',
'}':'{',
}
stack := []byte{}
for i:=0; i < n; i++ {
if _, ok := mapBrackets[s[i]]; ok {
if len(stack) == 0 || stack[len(stack)-1] != mapBrackets[s[i]] {
return false
}
stack = stack[:len(stack)-1]
} else {
stack = append(stack, s[i])
}
}
if len(stack) == 0 {
return true
}
return false
}