- 情况一:找到字符串形如 “……()”,找到()的前一个位置,所以 dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
- 情况二:找到字符串形如 “((……))”,找到子串“((……))” 前的第一个位置 i - dp[i - 1] - 2,所以 dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
class Solution {
public int longestValidParentheses(String s) {
int result = 0;
int[] dp = new int[s.length() + 1];
dp[0] = 0;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
}
else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
}
result = Math.max(result, dp[i]);
}
}
return result;
}
}
- 时间复杂度分析:O(n),其中 n为字符串的长度。我们只需遍历整个字符串一次,即可将 dp 数组求出来。