有效的括号
题目链接: https://leetcode.cn/problems/valid-parentheses
解题思路:
如果字符串长度为奇数,直接返回
false
使用一个栈来存储左括号,遍历字符串
s
中的每个字符如果当前字符是左括号,则将其压入栈中,如果当前字符是右括号,则从栈中弹出一个左括号进行匹配
如果栈为空,则说明没有左括号与当前右括号匹配,返回
false
,如果栈顶的左括号与当前右括号不匹配,则返回false
如果遍历完成后栈不为空,则说明还有左括号没有匹配,返回
false
。否则,返回true
func isValid(s string) bool {
// 如果字符串长度为奇数,直接返回 false
if len(s)&1 == 1 {
return false
}
// 创建一个栈,用于存储左括号
stack := make([]byte, len(s))
top := 0
// 遍历字符串中的每一个字符
for i := 0; i < len(s); i++ {
// 如果是左括号,将其入栈
if s[i] == '(' || s[i] == '{' || s[i] == '[' {
stack[top] = s[i]
top++
} else {
// 如果是右括号,判断栈是否为空
if top == 0 {
return false
}
// 如果栈不为空,判断栈顶元素是否与当前右括号匹配
if s[i] == ')' && stack[top-1] != '(' {
return false
}
if s[i] == '}' && stack[top-1] != '{' {
return false
}
if s[i] == ']' && stack[top-1] != '[' {
return false
}
// 如果匹配成功,将栈顶元素出栈
top--
}
}
// 如果栈为空,说明所有括号都匹配成功,返回 true
return top == 0
}
复杂度分析
时间复杂度: 只遍历了一遍字符串,因此时间复杂度为 ,其中 是字符串
s
的长度空间复杂度: 空间复杂度为 ,函数使用了一个长度为 的切片来存储栈。在最坏的情况下,栈的深度可能达到 ,所以空间复杂度为
最后更新于
这有帮助吗?