題目:
輸入由“{","[","(",")","]","}"," "組成的任意字符串,判斷是否是有效的。
- 括號必須按照正確的順序出現;
- 所有括號必須正確的閉合。
思路:
按順序遍歷字符串,左括號放入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
}