算法:判斷是否是有效的括號組合

題目:

    輸入由“{","[","(",")","]","}"," "組成的任意字符串,判斷是否是有效的。

  1. 括號必須按照正確的順序出現;
  2. 所有括號必須正確的閉合。

思路:

按順序遍歷字符串,左括號放入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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章