最长有效括号

128 阅读1分钟

问题描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

问题链接

最长有效括号

问题代码

class Solution {
    fun longestValidParentheses(s: String): Int {
        //1.初始化
        val n = s.length
        var max = 0

        //2.定义转义数组

        val dp = IntArray(n) {0}

        //3.转义方程

        for(i in 1..n-1) {
            if(s[i] == ')') {
                //i-1 == "("
                if(s[i-1] == '(') {
                    //当前括号前面的值
                    val prev = if(i>=2) dp[i-2] else 0
                    dp[i] = prev + 2
                }
                //i-1 == ")" 同时 dp[i-1] 前面有字符串,同时这个字符串为"("
                else if(i-dp[i-1] >0 && s[i-dp[i-1]-1] == '(') {
                    dp[i] = dp[i-1] + (if (i-dp[i-1]>=2) dp[i-dp[i-1]-2] else 0) +2
                }
                max = max.coerceAtLeast(dp[i])
            }
        }
        //4.结果
        return max
    }
}

参考思路

具体的转移方程如下:

  • 当 s[i] 为 '(' 时,以它结尾的字符串无论如何都不可能是一个合法的括号序列,因此 dp[i] 必定为 0。

  • 当 s[i] 为 ')' 时,我们分为两种情况:

    1. 当 s[i-1] 为 '(' 时,我们可以推出:dp[i] = dp[i-2] + 2;
    2. 当 s[i-1] 为 ')' 时,我们可以推出:如果 s[i-dp[i-1]-1] 为 '(',则 dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2。