Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"
题目的意思:寻找最长的合法括号子串的长度。
之前做过一道类似的题是用栈来实现的,这题试试dp实现。
用一个变量leftCount表示当前未匹配的左括号的数量,dp[i]表示到当前位置i为止匹配的括号数量,那么思路就很明了了
class Solution {
public int longestValidParentheses(String s) {
if(s.length() == 0) return 0;
int max=0,leftCount=0;
int[] dp=new int[s.length()];
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '('){//这里已经处理了dp[0]=0的情况,不需要预处理dp[0]
leftCount++;
}
else if(leftCount > 0){
dp[i]=dp[i-1]+2;//这个dp[i-1]一般为0,因为右括号前面的左括号的话是还没算到长度的,所以下面才需要将
dp[i] += (i-dp[i]) >= 0 ? dp[i-dp[i]] : 0;//加上匹配位置之前的最长长度,i-dp[i]是获得合法括号字符串的起点
max=Math.max(max,dp[i]);
leftCount--;
}
}
return max;
}
}