题目:
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
思路: 利用动态规划
设字符串的长度为 n ,定义一个长度为 n 的数组 dp ,默认值为 0。其中,dp[i] 代表 以 s[i] 结尾的子字符串的最长有效括号的长度。
以字符串 s = ")()())" 为例:
dp[5]=0 , dp[4] = 4
1. 若是 s[i] == '(' dp[i] = 0
2. 若是 s[i] == ')'
(1) 若是 s[i-1] == '('
dp[ i ] = dp[ i -2] + 2
(2) 若是 s[i-1]==')'
1) 若是 s[ i - dp[i-1] - 1] == '('
dp[ i ] = dp[ i -1] + 2 + dp[ i - dp[i-1] -2 ]
2) 若是 s[ i - dp[i-1] -1] == ')'
dp[ i ] = 0
java 代码如下:
class Solution {
public int longestValidParentheses(String s) {
int n = s.length();
if (n<2){ // "" 与 "(" ")"
return 0;
}
int[] dp = new int[n]; // dp[i] 代表 以 s[i] 为结尾的子字符串(包含s[i]) 的 最长有效括号的长度
int max = 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)=='('){
if(i-2<0){
dp[i] = 2;
} else {
dp[i] = 2 + dp[i - 2];
}
} else if(s.charAt(i-1)==')'){
if(i-dp[i-1]-1<0){
dp[i] = 0;
} else {
if(s.charAt(i-dp[i-1]-1)=='(') {
if(i-dp[i-1]-2 <0){
dp[i] = dp[i-1] +2;
} else {
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];
}
} else if(s.charAt(i-dp[i-1]-1) == ')'){
dp[i] = 0;
}
}
}
}
max = max > dp[i] ?max:dp[i];
}
return max;
}
}