题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
提示:
- 1 <= s.length <= 104
- s 仅由括号 '()[]{}' 组成
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
思路分析
- 这个题目毋庸置疑,想到的就是利用栈的特性
- 比较麻烦的是,go里面没有现成的栈,需要自己想办法去构造
- 还有一些小细节,比如判断字符串长度,如果是单数肯定不匹配
AC代码
// 执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
// 内存消耗:2 MB, 在所有 Go 提交中击败了61.85%的用户
func isValid(s string) bool {
// 这里其实挺巧妙的,一开始还没想到
if len(s) % 2 == 1 {
return false
}
dataMap := map[byte]byte{
')': '(',
']': '[',
'}': '{',
}
// golang使用slice实现栈的作用。尾部为栈顶
// 通过append入栈,截取出栈
var stack []byte
for i := 0; i < len(s); i++ {
// 判断是不时右边的括号
if dataMap[s[i]] > 0 {
// 判断是否栈空、栈顶元素是否匹配
if len(stack) == 0 || stack[len(stack) - 1] != dataMap[s[i]] {
return false
}
stack = stack[0:len(stack) - 1]
} else {
stack = append(stack, s[i])
}
}
return len(stack) == 0
}
总结
- 不同编程语言掌握程度,对解题也是蛮有影响的