有时候递归改成记忆化搜索后报错或时间复杂度较高,可以试试用递推的角度考虑,直接位置依赖
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
提示:
0 <= s.length <= 3 * 104
s[i]
为'('
或')'
递归解法
//str[i]为“)”的最大长度
public static int f(char[] str,int i) {if(str[i] == '(') {return 0;}if(i == 0) {return 0;}if(i == 1) {if(str[0] == '(') {return 2;}else {return 0;}}if(str[i-1] == '(') {return 2 + f(str,i-2);}int a = f(str,i-1);if(i-1-a >= 0 && str[i-1-a] == '(') {return i-1-a-1 >= 0 ? a+2+f(str,i-1-a-1) : a + 2;}return 0;}
动态规划(递推)
// 时间复杂度O(n),n是str字符串的长度public static int longestValidParentheses(String str) {char[] s = str.toCharArray();// dp[0...n-1]// dp[i] : 子串必须以i位置的字符结尾的情况下,往左整体有效的最大长度int[] dp = new int[s.length];int ans = 0;for (int i = 1, p; i < s.length; i++) {if (s[i] == ')') {p = i - dp[i - 1] - 1;// ? )// p iif (p >= 0 && s[p] == '(') {dp[i] = dp[i - 1] + 2 + (p - 1 >= 0 ? dp[p - 1] : 0);}}ans = Math.max(ans, dp[i]);}return ans;}