算法:判断是否是有效的括号组合

题目:

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

  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
}

 

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