0032.最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3: 输入:s = "" 输出:0
提示: 0 <= s.length <= 3 * 10⁴ s[i] 为 '(' 或 ')'
解题思路:
- 维护一个栈,遇到( 入栈,遇到 ) 弹出栈顶元素
- 栈为空,当前右括号为新的起始点(引入-1为辅助栈元素)
- 更新最长括号长度
func longestValidParentheses(s string) int {
// 假设我们的字符串是 "()",这时如果没有初始的-1在栈中,那么在遇到第一个右括号时,栈为空,无法确定有效括号的起始点。因此,我们将-1作为初始值放入栈中,当遇到右括号时,就可以直接使用它作为起始点。
stack := []int{-1} // 栈,初始化时压入-1作为辅助计算长度
maxLength := 0
for i, char := range s {
if char == '(' { // 左括号
stack = append(stack, i)
} else { // 右括号
stack = stack[:len(stack)-1] // 弹出栈顶元素
if len(stack) == 0 { // 栈为空,当前右括号为新的起始点
stack = append(stack, i)
} else { // 更新最长有效括号长度
length := i - stack[len(stack)-1]
if length > maxLength {
maxLength = length
}
}
}
}
return maxLength
}