有效圆括号问题索引超出范围(Go)



我正在将之前在Python中解决的一个问题的代码转换为Go,并遇到运行时错误:索引超出范围[1],此行长度为1

if string(s[i]) == ")" && arr[len(s) - 1] == "("{

这是完整的代码。

func isValid(s string) bool {
arr := make([]string, 0)
if len(s) < 2 {
return false 
}
for i := 0; i < len(s); i++ {
if string(s[i]) == "(" || string(s[i]) == "[" || string(s[i]) == "{" {
arr = append(arr, string(s[i]))
} else if string(s[i]) == ")" || string(s[i]) == "]" || string(s[i]) == "}" {
if len(arr) >= 1 { 
if string(s[i]) == ")" && arr[len(s) - 1] == "("{ 
arr = arr[:len(arr) -1]
} else if string(s[i]) == "]" && arr[len(s) - 1] == "[" {
arr = arr[:len(arr) -1]
} else if string(s[i]) == "}" && arr[len(s) - 1] == "{" {
arr = arr[:len(arr) -1]
}  else {
return false
}
}else {
return false
}
}
}
if reflect.DeepEqual(arr, []string{""}) {
return true
} else  {
return false
}

}

问题的原因是什么?

您已经使用len(s)-1来查找arr的最后一个索引,但它应该是len(arr)-1

这是您的代码的一个工作版本,它修复了一些额外的错误,并避免了不必要的转换为单个字符的字符串。https://go.dev/play/p/sazf2RguoIr

package main
import "fmt"
func isValid(s string) bool {
var arr []rune
for _, c := range s {
if c == '(' || c == '[' || c == '{' {
arr = append(arr, c)
} else if c == ')' || c == ']' || c == '}' {
if len(arr) == 0 {
return false
}
var last rune
arr, last = arr[:len(arr)-1], arr[len(arr)-1]
if c == ')' && last != '(' || c == ']' && last != '[' || c == '}' && last != '{' {
return false
}
}
}
return len(arr) == 0
}
func main() {
cases := []string{
"()[({}())]",
"(]",
"((())",
"{{{}}}",
"{{{[][][]}}}",
}
for _, c := range cases {
fmt.Println(c, isValid(c))
}
}

相关内容

  • 没有找到相关文章