最长有效括号
- 给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
解题思路
- 1、使用动态规划求解,定义一个一维数组dp,其中dp[i]表示以第i个字符结尾的最长有效括号子串的长度。
- 2、初始化dp数组,将所有元素初始化为0。
- 3、从第二个字符开始遍历字符串,对于每个字符:
如果当前字符是’)‘,且前一个字符是’(', -
如果当前字符是’)‘,且前一个字符是’)‘,且以第i-1个字符结尾的最长有效括号子串的前一个字符是’(‘(即i-dp[i-1]-1处的字符是’('),则更新dp[i] = dp[i-2] + 2。
-
则更新dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2。
- 4、遍历dp数组,找出其中的最大值作为结果返回。
java实现
public class LongestValidParentheses {
public int longestValidParentheses(String s) {
int n = s.length();
int[] dp = new int[n];
int maxLen = 0;
for (int i = 1; i < n; i++) {
if (s.charAt(i) == ')') {
if (s.charAt(i - 1) == '(') {
//大于2,证明除了当前()字符之外,前面还有额外的字符
//需要额外字符的有效括号长度dp[i-2]+2
//否则为0+2
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
} else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
//i - dp[i - 1] >= 2 判断'('前面是否还有字串
//若前面还有串则需要加上前面的串的有效括号长度dp[i - dp[i - 1] - 2]
//=1只有本身的串了 直接加0
//最后加上新增的一对括号的长度
dp[i] = dp[i - 1] + (i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
}
maxLen = Math.max(maxLen, dp[i]);
}
}
return maxLen;
}
public static void main(String[] args) {
LongestValidParentheses solution = new LongestValidParentheses();
String s = "((()))())()";
System.out.println("Longest valid parentheses length: " + solution.longestValidParentheses(s)); // Output: 4
}
}
时间空间复杂度
-
时间复杂度:遍历了一次字符串s,时间复杂度为O(n),其中n为字符串s的长度。文章来源:https://www.toymoban.com/news/detail-859864.html
-
空间复杂度:使用了一个一维数组dp,空间复杂度为O(n)。文章来源地址https://www.toymoban.com/news/detail-859864.html
到了这里,关于【动态规划】Leetcode 32. 最长有效括号【困难】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!