题目
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “([)]”
输出:false
示例 4:
输入:s = “{[]}”
输出:true
思路(流程图):
- 遍历字符串,遇到左方向的括号就把字符push入栈
- 遇到右方向的括号的字符b2,就pop栈中的一个字符b1出来,检查是否匹配:若匹配,则检查下一个;若不匹配,直接返回false,结束检查
- 遍历完字符串后,检查栈内是否还有元素:如果有,代表匹配失败,返回false; 如果没有,匹配成功,返回true;
代码(Go语言):
//先定义一个栈结构
type stack struct {
top int
data []byte
}
//栈结构方法-入栈
func (s *stack) push(b byte) {
s.data = append(s.data, b)
s.top++
}
//栈结构方法-出栈
func (s *stack) pop() byte{
b := s.data[len(s.data)-1]
s.data = s.data[:len(s.data)-1]
s.top--
return b
}
//栈结构方法-是否为空栈
func (s *stack) isEmpty() bool{
return len(s.data) == 0
}
//判断是否为有效的括号
func isValid(s string) bool {
if len(s) == 1 {
return false
}
byteslice := []byte(s)
helpstack := &stack{top: -1}
for i := 0; i < len(s); i++ {
if byteslice[i] == '(' || byteslice[i] == '[' || byteslice[i] == '{' {
helpstack.push(byteslice[i])
}else if byteslice[i] == ')' || byteslice[i] == ']' || byteslice[i] == '}' {
if helpstack.isEmpty() {
return false
}else{
b1 := helpstack.pop()
if ! match(b1, byteslice[i]) {
return false
}
}
}else{
return false
}
}
return helpstack.isEmpty()
}
//判断字符是否匹配
func match(b1, b2 byte) bool {
if (b1 == '(' && b2 == ')') || (b1 == '[' && b2 == ']') || (b1 == '{' && b2 == '}'){
return true
}
return false
}