题目:
输入由“{","[","(",")","]","}"," "组成的任意字符串,判断是否是有效的。
- 括号必须按照正确的顺序出现;
- 所有括号必须正确的闭合。
思路:
按顺序遍历字符串,左括号放入slice里面,遇到右括号则判断前一个是否为搭配的左括号,如果是则弹出;如果不是则字符串无效。最终遍历完之后,slice应该为空,否则说明有未闭合的括号,字符串无效。
package main
import (
"bufio"
"fmt"
"os"
)
// 左右括号关联
var m = map[string]string{
"(": ")",
"[": "]",
"{": "}",
}
var tmp []string
func main() {
var str string
s := bufio.NewScanner(os.Stdin)
s.Scan()
str = s.Text()
// 读入输入,把符号按顺序写入列表list
list := make([]string, 0)
tmp = make([]string, 0)
for i := 0; i < len(str); i++ {
if string(str[i]) != " " {
list = append(list, string(str[i]))
}
}
fmt.Println(validSlice(list))
}
// 校验列表是否合法
func validSlice(list []string) bool {
// 如果不是2的整倍数或者空列表,肯定是非法的
if len(list)%2 != 0 || len(list) == 0 {
return false
}
// 不以左括号开头,非法
if _, ok := m[list[0]]; !ok {
return false
}
// 不以右括号结尾,非法
if list[len(list)-1] != "]" && list[len(list)-1] != "}" && list[len(list)-1] != ")" {
return false
}
// 遍历列表,遇到左括号则加入tmp里面,遇到右括号判断前一个是否是对应的左括号
for _, v := range list {
if _, ok := m[v]; ok {
tmp = append(tmp, v)
} else {
if len(tmp) == 0 || m[tmp[len(tmp)-1]] != v {
return false
}
tmp = tmp[:len(tmp)-1]
}
}
if len(tmp) == 0 {
return true
}
return false
}