问题描述
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
问题链接
问题代码
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] 为 ')' 时,我们分为两种情况:
- 当 s[i-1] 为 '(' 时,我们可以推出:dp[i] = dp[i-2] + 2;
- 当 s[i-1] 为 ')' 时,我们可以推出:如果 s[i-dp[i-1]-1] 为 '(',则 dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2。