问题描述
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
For “(()(()”, the longest valid parentheses substring is “()”, which has length = 2.
Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.
思考:考虑()的嵌套:((()))和循环()()()
想法:动态规划
- 1、考虑嵌套时,dp[i] = dp[i] + dp[i + 1] 如果s.charAt(i - 1) = s.charAt(i);
- 2、考虑循环时,dp[i]的前一个()的标号位i - dp[i], 如:()()((()));
代码:
public class Solution {
public int longestValidParentheses(String s) {
int toMatch = 0;
int max = 0;
int[] dp = new int[s.length() + 1];
for(int i = 1 ; i <= s.length(); i++){
if(s.charAt(i - 1) == '(')
toMatch++;
else{
if(toMatch > 0){
toMatch--;
dp[i] = 2;
if(s.charAt(i - 2) == ')')//the "((()))",嵌套
dp[i] += dp[i - 1];
dp[i] += dp[i - dp[i]]; //()()()循环
if(dp[i] > max)
max = dp[i];
}
}
}
return max;
}
}