题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例
输入:s = “()[]{}”
输出:true
解析
这道题用栈来解决,后进先出;左括号入栈,有括号判断与最后入栈的是否匹配,不匹配返回false,匹配则弹出末尾元素;最后栈为空的话则符合预期
// func isValid(s string) bool {
// hash := map[byte]byte{')' : '(', '}' : '{', ']' : '['}
// stack := make([]byte, 0) //定义了一个切片
// if s == "" {
// return true
// }
// for i:=0; i < len(s); i++ {
// if s[i] == '(' || s[i] == '[' || s[i] == '{' { //左括号的话就进栈
// stack = append(stack, s[i])
// } else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] {
// stack = stack[:len(stack)-1]
// } else {
// return false
// }
// }
// return len(stack) == 0
// }
// 上面的也是可以的,这道题没必要像下面一样定义一个b(应该是要改动字符串的时候才这么定义)
func isValid(s string) bool {
hash := map[byte]byte{')' : '(', '}' : '{', ']' : '['}
stack := make([]byte, 0) //定义了一个切片
b := []byte(s)
if s == "" {
return true
}
for i:=0; i < len(b); i++ {
if b[i] == '(' || b[i] == '[' || b[i] == '{' { //左括号的话就进栈
stack = append(stack, b[i])
} else if len(stack) > 0 && stack[len(stack)-1] == hash[b[i]] {
stack = stack[:len(stack)-1]
} else {
return false
}
}
return len(stack) == 0
}