题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 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 } }
运行结果