给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
思路:动态规划,用dp[i]表示以i为结尾时最长有效括号的长度
当s[i]==’(‘时,不做操作,
当 s[i]=’)‘时,我们判断 i 之前是否有和‘)’相匹配的括号,由于每个位置只有两种情况要么‘(’ 要么时是’)’。
第一种情况,若s[i-1]=’(‘时,dp[i]=dp[i-2]+2 (i-2>=0) “…()”
第二种情况,若s[i-1]=’)‘时,前面或许有和s[i-1]相匹配的括号,若s[i-1-dp[i-1]]=’('时(i-1-dp[i]>=0)表示有和s[i]有相匹配的括号, dp[i]=dp[i-2-dp[i-1]]+dp[i-1]+2 “…((…))”
最后返回dp[i]的最大值
public int longestValidParentheses(String s) {
if(s.length()<2)
return 0;
int[] dp=new int[s.length()];
int max=0;
for(int i=1;i<s.length();i++){
if(s.charAt(i)==')'){
if(s.charAt(i-1)=='(')
dp[i]=2+(i-2>=0?dp[i-2]:0);
else if(i-1-dp[i-1]>=0&&s.charAt(i-1-dp[i-1])=='(')
dp[i]=dp[i-1]+2+(i-2-dp[i-1]>=0?dp[i-2-dp[i-1]]:0);
max=Math.max(max,dp[i]);
}
}
return max;
}