题目:

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

LeetCode,Go算法实现有效的括号_字符串

解题思路

存储左括号和右括号的映射,用栈统计左括号,出现左括号就入栈,出现右括号就和栈顶在 map中映射的右括号比较,如果匹配就出栈,不匹配返回 false,最后遍历完的栈为空,则返回 true,否则返回 false。

func isValid(s string) bool {
    m := map[byte]byte{'{':'}','[':']','(':')'}
	var stack []byte
	for i := 0; i < len(s); i++ {
		if _, ok := m[s[i]]; ok {
			stack = append(stack,s[i])
		}else{
			if len(stack)>0 && m[stack[len(stack)-1]] ==s[i]{
				stack = stack[:len(stack)-1]
			}else{
				return false
			}
		}
	}
	return len(stack) == 0
}
复制代码

思路二

对于给定的字符串 s ,如果有成对出现的括号,则把它们消去(替换为空),再依次判断是否还有成对的括号,有则消去,直到没有成对的括号出现为止,最后判断字符串 s 是否为空,为空则所有括号都正确成对,已被消去,返回 true,不为空则说明存在非法括号,返回 false。

import (
	"fmt"
	"strings"
)

func main() {
	re := isValid("([]])")
	fmt.Println(re)
}
func isValid(s string) bool {
	for {
		find1 := strings.Contains(s, "()")
		find2 := strings.Contains(s, "[]")
		find3 := strings.Contains(s, "{}")
		if find1 || find2 || find3 {
			s = strings.Replace(s,"()","",-1)
			s = strings.Replace(s,"[]","",-1)
			s = strings.Replace(s,"{}","",-1)
		}else{
			break
		}
	}
	return len(s)==0
}
复制代码