题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 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
}