NOTE
有效的括号
判断括号序列是否合法:栈与字符串替换。
这是历史学习笔记,可能存在过时或不完整的理解。
1. 题目描述
给出一个仅包含字符’(‘,’)’,‘{’,‘}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,“()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]“不合法。
2. 思路
- 思路一
- 栈
- 遍历所有元素,如果是左括号那么入栈,是右括号那么取出栈顶元素看是否和右括号匹配
- 是否匹配需要一个HashMap
- 如果最后遍历完且栈为空,那么就是有效的括号序列
- 思路二
- 字符串替换
3. 实现
3.1. 栈
var m = map[rune]rune {
'(':')',
'[':']',
'{':'}',
}
func isValid(s string) bool {
stack := make([]rune, 0)
for _, r := range []rune(s) {
if isLeft(r) {
stack = append(stack, r)
} else if isRight(r){
if len(stack) > 0 && isMatch(stack[len(stack)-1], r) {
stack = stack[:len(stack)-1]
continue
}
return false
} else {
return false
}
}
return len(stack) == 0
}
func isLeft(r rune) bool {
return r == '(' || r == '{' || r == '['
}
func isRight(r rune) bool {
return r == ')' || r == '}' || r == ']'
}
func isMatch(left, right rune) bool{
return m[left] == right
}
3.2. 字符串替换
func isValid2(s string) bool {
if len(s)%2 != 0 {
return false
}
flag := true
for flag {
oldLength := len(s)
s = strings.Replace(s, "()", "", -1)
s = strings.Replace(s, "{}", "", -1)
s = strings.Replace(s, "[]", "", -1)
if len(s) == oldLength {
flag = false
}
}
return len(s) == 0
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看