tips1:右括号不一定出现在左括号的下一位
如:
输入:s="{([])}"
输出:true
tips2:pairs[s[i]]=pairs[')']='('=40>0
' ('的ASCII码值为40,所以大于0
法一:栈
解题思路:
1.字符串为奇数一定不是有效的括号
2.用哈希表存储哈希表的键为右括号,值为相同类型的左括号
2.遍历字符串s的所有括号
一、pairs的键为右括号:
1)栈为空,说明s都是右括号,直接返回false
2)右括号s[i]和栈顶stack[len(stack)-1]里的左括号不匹配,
即pairs[s[i]]!=stack[len(stack)-1],直接返回false
3)右括号和左括号匹配,即pairs[s[i]]=stack[len(stack)-1],出栈一个左括号元素
二、遍历到的括号为左括号,即非pairs的键:
1)左括号入栈
最后,比较len(stack)==0
func main{
var s string//s是一个字符串,不能写成var s []string
s="[{}()"//不能写成s=“[{}()”
ans2:=isValid(s)
fmt.Println(ans2)
}
func isValid(s string) bool {
n := len(s)
if n%2 == 1 {//字符串长度为奇数
return false
}
m := map[byte]byte{
')': '(',
'}': '{',
']': '[', //最后一个也要加逗号
}
stack := []byte{}
for i:=0;i<n;i++{
if m[s[i]]>0{//判断m的ASCII值
if len(stack)==0||stack[len(stack)-1]!=m[s[i]]{
return false
}
stack=stack[:len(stack)-1]//左括号出栈
}else{
stack=append(stack,s[i])//左括号入栈
}
}
return len(stack)==0
}
时间复杂度:O(n),n为字符串长度
空间复杂度:O(n+|∑|):n为栈中的字符数量,|∑|为哈希表中的字符数量