解法一:辅助栈
遇到左括号就入栈,遇到右括号就去栈中寻找最近的左括号,看是否匹配。
func isValid(s string) bool {
stack := make([]rune, 0)
for _, c := range s{
if c == '(' || c == '[' || c == '{'{ // 左括号压栈
stack = append(stack, c)
}else{ // 右括号判断是否匹配最近一个左括号
need := leftOf(c)
if len(stack) > 0 && need == stack[len(stack)-1]{
stack = stack[:len(stack)-1] // 匹配成功,出栈
}else{
return false // 匹配失败
}
}
}
// 是否所有的左括号都匹配完了
return len(stack) == 0
}
func leftOf(c rune) rune {
switch c {
case ')':
return '('
case ']':
return '['
case '}':
return '{'
}
return 0
}