题目描述
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入: s = “(()”
 输出: 2
 解释: 最长有效括号子串是 “()”
示例 2:
输入: s = “)()())”
 输出: 4
 解释: 最长有效括号子串是 “()()”
示例 3:
输入: s = “”
 输出: 0
提示:
- 0 <= s.length <= 3 * 104
- s[i]为- '('或- ')'
代码及注释
func longestValidParentheses(s string) int {res := 0 // 用于存储最长有效括号子串的长度stack := []int{-1} // 使用栈来存储'('的下标// 遍历字符串 sfor i := 0; i < len(s); i++ {if s[i] == '(' {// 如果遇到 '(',将其下标入栈stack = append(stack, i)} else {// 如果遇到 ')',将栈顶元素出栈stack = stack[:len(stack) - 1]if len(stack) == 0 {// 如果栈为空,说明当前的 ')' 无法匹配,更新栈顶元素为当前的下标stack = append(stack, i)} else {// 计算当前有效括号子串的长度,并更新 resres = max(res, i - stack[len(stack) - 1])}}}return res // 返回最长有效括号子串的长度
}
代码解释
-  初始化: res := 0 // 用于存储最长有效括号子串的长度 stack := []int{-1} // 使用栈来存储'('的下标- res用于记录最长有效括号子串的长度。
- stack用于存储’('的下标,初始化时放入 -1 作为哨兵。
 
-  遍历字符串 s: for i := 0; i < len(s); i++ {- 对字符串 s进行遍历。
 
- 对字符串 
-  处理 ‘(’: if s[i] == '(' {stack = append(stack, i) }- 如果遇到 ‘(’,将其下标 i入栈。
 
- 如果遇到 ‘(’,将其下标 
-  处理 ‘)’: } else {stack = stack[:len(stack) - 1]if len(stack) == 0 {stack = append(stack, i)} else {res = max(res, i - stack[len(stack) - 1])} }- 如果遇到 ‘)’,将栈顶元素出栈。
- 如果栈为空,说明当前的 ‘)’ 无法匹配,将当前的下标 i入栈。
- 如果栈不为空,计算当前有效括号子串的长度 i - stack[len(stack) - 1],并更新res。
 
-  返回结果: return res- 返回最长有效括号子串的长度 res。
 
- 返回最长有效括号子串的长度 
使用栈来存储未匹配的括号的下标,时间复杂度为 O(n),其中 n 是字符串 s 的长度。