LeetCode320-最长有效括号
题目
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解法
思路:使用dp的方法
我们定义dp[i] 表示以下标 i 字符结尾的最长有效括号的长度。我们将dp 数组全部初始化为 0 。显然有效的子串一定以‘)’ 结尾,因此我们可以知道以‘(’ 结尾的子串对应的dp 值必定为 0 ,我们只需要求解‘)’ 在dp 数组中对应位置的值。
如果我们遇到了"(",不用管他,当遇到了")",我们可以运用dp的思想
1.s[i] = ")"且s[i-1] = “(”,也就是字符串形如“……()”,我们可以推出
dp[i] = dp[i-2]+2
若i<2,则dp[i] = 2
2.s[i] = ")"且s[i-1] = “)”,也就是字符串形如“……))”,我们可以推出
若s[i-dp[i-2]+1] = '('那么
dp[i] = dp[i-1]+dp[i-dp[i-1]-2]+2
class Solution {
public int longestValidParentheses(String s) {
if(s.length() == 0 || s == null) return 0;
int n = s.length();
int[] dp = new int[n];
int max = 0;
for(int i = 1; i < n ; ++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;
}
}
max = Math.max(max,dp[i]);
}
return max;
}
}