跳转至

LC32 - 最长有效括号

LongestValidParentheses.go
package DP

func longestValidParentheses(s string) int {
    size := len(s)
    dp := make([]int, size)
    ans := 0
    for i := 1; i < size; i++ {
        if s[i] == '(' {
            // (1) 当前位置为左括号,直接取0
            dp[i] = 0
        } else {
            tmp := dp[i-1]
            if i-1-tmp < 0 || s[i-1-tmp] == ')' {
                // (2) tmp位置不存在或为右括号,直接取0
                dp[i] = 0
            } else {
                // (3) 当前位置的有效括号串长度至少有 2+tmp
                dp[i] = 2 + tmp
                if i-2-tmp >= 0 {
                    // (4) 若i-2-tmp位置存在,则将其对应长度加到当前位置
                    dp[i] += dp[i-2-tmp]
                }
            }
        }
        ans = max(ans, dp[i])
    }
    return ans
}

本题难度相对较大,建议背题,更详细的分析过程参见左神算法讲解。