题目描述
给出一个仅包含字符'('和')'的字符串,计算最长的格式正确的括号子串的长度。
对于字符串"(()"来说,最长的格式正确的子串是"()",长度为2.
再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.
示例1
输入
"(()"
返回值
2
思路
- Q1:dp如何设置?
一开始我设置dp[n+1][n+1],因为这题感觉和回文子串有点想,然而最后发现并不行,看过题解后发现别人设置dp[n+1],dp[i]表示s[:i]的结果。 - Q2:状态转移方程
看的别人题解,十分地巧妙,具体可看https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/
code
import java.util.*;
public class Solution {
public int longestValidParentheses (String s) {
char[] chs = s.toCharArray();
int n = chs.length;
if(n==0)return 0;
int[] dp = new int[n];
int max=0;
for(int i=1;i<n;i++){
if(chs[i]==')'){
if(chs[i-1]=='(')
dp[i]=(i>=2?dp[i-2]:0)+2;
else if(i-dp[i-1]>0 && chs[i-dp[i-1]-1]=='('){
if(i-dp[i-1]-2>=0)
dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2;
else
dp[i]=dp[i-1]+2;
}
max = Math.max(max,dp[i]);
}
}
return max;
}
}
京公网安备 11010502036488号