Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
春招打卡第16天第19篇。
勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。
掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。
Let's GO!
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解题思路
- 看到题之后考虑到的就是匹配问题,即最内部的括号一定是左右相对称的,但是外部的括号不一定,因为外部的括号内不一定包含了几个成对存在的括号
- 既然是成对出现的,那么如果输入的字符串是奇数的长度,直接return false
- 声明map,以右括号为key,左括号为value,方便我们在循环遍历的时候判断赋值
- 声明一个存储元素用的切片a
- 当遍历的元素是左括号时,把元素追加到切片a中
- 当遍历的元素是右括号且切片a不为空(为空肯定不对啦,右括号需要左括号闭合呀)且切片a中最后一个元素是对应的左括号,说明满足匹配条件,重置切片a的值;否则的话说明不符合预制要求,return false
- 当循环结束后,如果切片a的为空(遍历匹配后重置了切片a的值)说明符合要求返回true;否则返回false。
AC代码
func isValid(s string) bool {
if len(s) % 2 == 1 { return false }
m := map[byte]byte{
')':'(',
']':'[',
'}':'{',
}
a := make([]byte, 0, len(s)/2)
for _, b := range []byte(s){
if b == '(' || b == '{' || b == '['{
a = append(a, b)
continue
}
if b == ')' || b == '}' || b == ']'{
if len(a) >0 && m[b] == a[len(a)-1]{
a = a[:len(a)-1]
continue
}else {
return false
}
}
}
if len(a) == 0 {
return true
}else {
return false
}
}
运行结果
总结
GO切片相关的知识点大家可以查看:# Go slice切片详解和实战,# Go slice切片详解和实战(2) make append copy
GO map相关的知识点可以查看:# Go map详解和实战
来源
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/va…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最后
感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!