算法练习之 20.有效的括号

题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

分析

如果想要匹配开始括号和结束括号,并且顺序一致,我们就会发现:字符串中一旦匹配到结束括号后,就说明括号开始结束,并且结束括号的顺序和开始括号相反,即第一开括号,必定最后一个结束。学习过数据结构的盆友们应该就会发现,这个和栈很像。我们可以通过栈来对括号进行匹配。

因为栈是先进后出,所以只需遍历字符串一遍,如果匹配到开括号,则执行put操作,将开括号put进入栈。如果匹配到闭括号,则将最后一个开括号push出来,与闭括号进行匹配。如果匹配不成功则直接返回false。如果匹配成功,则进行匹配下一个括号,知道字符串遍历完。

字符串遍历完后,如果栈中还有剩余的开括号,则表明匹配失败,返回false。

在这里插入图片描述

代码

/**
栈法
思路:最先开始的括号必定是最后结束的,这个就和先进后出的栈一样。所以我们可以将开始的括号放入栈中,
然后遍历字符串,如果匹配到结束括号,则从栈中push出一个开始括号,对结束括号和开始括号进行匹配,如果匹配不上则直接返回false,直到匹配到结尾。
 */
var brackets = map[string]string{"{": "}", "[": "]", "(": ")"}

func isValid(s string) bool {
	var c string
	array := make([]string, 0)//用于存储开括号的栈
	for _, v := range s {//遍历字符串
		c = string(v)
		if c == "{" || c == "[" || c == "(" { //如果匹配到开括号,将其put in栈
			array = append(array, c)
		}else if  c == "}" || c == "]" || c == ")" {//如果匹配到闭括号,则将栈最后一个开括号put out出,并与闭括号进行匹配
			l := len(array)
			//如果栈为空,或者开括号与闭括号不匹配,则直接返回false
			if l==0 || brackets[array[l-1]] != c{
				return false
			}else{//否则直接将开括号push出栈
				array = array[:l-1]
			}
		}
	}
	if len(array) != 0 {
		return false
	}
	return true
}

猜你喜欢

转载自blog.csdn.net/ywloveb/article/details/87529700