题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
代码及注释
该函数 isValid
用于检查一个字符串 s
是否为有效的括号字符串。以下是该函数的注释和代码解释:
go
func isValid(s string) bool {
// 使用一个切片作为模拟栈来存储左括号
queue := make([]byte, 0)
// 遍历字符串中的每个字符
for i := 0; i < len(s); i++ {
// 如果队列不为空,检查当前字符与队列顶部的字符是否匹配
if len(queue) > 0 {
if s[i] == ')' && queue[len(queue) - 1] == '(' {
// 如果匹配,弹出队列顶部的字符
queue = queue[:len(queue) - 1]
} else if s[i] == ']' && queue[len(queue) - 1] == '[' {
queue = queue[:len(queue) - 1]
} else if s[i] == '}' && queue[len(queue) - 1] == '{' {
queue = queue[:len(queue) - 1]
} else {
// 如果不匹配,将当前字符推入队列
queue = append(queue, s[i])
}
} else {
// 如果队列为空,将当前字符推入队列
queue = append(queue, s[i])
}
}
// 如果队列为空,则说明所有的括号都能匹配,返回true;否则返回false
return len(queue) == 0
}
代码解释
- 遍历字符串
s
中的每个字符。 - 如果当前字符是左括号(
(
、[
、{
),将其压入模拟栈(队列queue
)。 - 如果当前字符是右括号(
)
、]
、}
),检查栈顶的左括号是否与之匹配,如果匹配则弹出栈顶的左括号;如果不匹配,则将当前字符压入模拟栈。 - 最后,检查模拟栈是否为空,若为空则说明所有的括号都匹配,返回
true
,否则返回false
。
该算法的时间复杂度是 O(n),其中 n 是字符串 s
的长度。