dp[i]以i下标字符结尾的最长有效字符串的长度。
列举可能出现的有效括号的情况:
- ()
- ...()
- ((...))
- ...((...))
import java.util.*;
public class Solution {
public int longestValidParentheses (String s) {
if (s == null || s.isEmpty()) {
return 0;
}
int n = s.length();
// dp[i]表示以i结尾最长有效括号的长度
int[] dp = new int[n];
int maxLen = 0;
dp[0] = 0;
for (int i = 1; i < n; i++) {
if (s.charAt(i) == '(') {
dp[i] = 0;
} else if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
// ()的情况
dp[i] = 2;
// ...()的情况
if (i - 2 > 0) {
dp[i] = dp[i - 2] + 2;
}
} else if (s.charAt(i - 1) == ')') {
// ((...))的情况
// i-dp[i-1]-1为外层括号的下标
if (dp[i - 1] > 0 && (i - dp[i - 1] - 1) >= 0 &&
s.charAt(i - dp[i - 1] - 1) == '(') {
dp[i] = dp[i - 1] + 2;
if (i - dp[i - 1] - 2 > 0) {
// ...((...))的情况
dp[i] = dp[i - dp[i - 1] - 2] + dp[i - 1] + 2;
}
} else {
dp[i] = 0;
}
}
}
maxLen = Math.max(maxLen, dp[i]);
}
return maxLen;
}
}

京公网安备 11010502036488号