LeetCode第32题-最长有效括号-java实现-图解思路与手撕代码
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
对于最长类问题,可以考虑采用动态规划解决问题。
首先创建数组dp,遍历字符串s。
如果s(i)=(',则dp(i)=0
如果s(i)=‘)’,有两种情况:
若s(i-1)=‘(’,则
dp(i)=dp(i-1)+2
若s(i-1)=‘)’,且s(i-dp(i-1)-1)=‘(’,则
dp(i)=dp(i-1)+dp(i-dp(i-1)-2)+2
其余情况dp(i)=0。
代码如下(示例):
private static int longestValidParentheses(String s) {
if (s.length() <= 1) {
return 0;
}
char[] ch = s.toCharArray();
int res = 0;
int[] dp = new int[s.length()];
dp[0] = 0;
for (int i = 1; i < s.length(); i++) {
if (ch[i] == '(') {
dp[i] = 0;
} else {
if (ch[i - 1] == '(') {
dp[i] = i - 2 >= 0 ? dp[i - 2] + 2 : 2;
} else {
if (i - dp[i - 1] - 1 >= 0 && ch[i - dp[i - 1] - 1] == '(') {
dp[i] =i - dp[i - 1] - 2>=0 ? dp[i - 1] + dp[i - dp[i - 1] - 2] + 2:dp[i - 1] + 2;
} else {
dp[i] = 0;
}
}
res = Math.max(res, dp[i]);
}
}
return res;
}
注意:其中数组下标要先确定没有越界。
对于最长类问题,可以使用动态规划进行求解。
动态规划题目分析的 4 个步骤:
1、确定状态
2、转移方程
根据问题定义得到
3、初始条件和边界情况
4、计算顺序