32. 最长有效括号
Problem: 32. 最长有效括号
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
给你一个只包含 ′ ( ′ '(' ′(′ 和 ′ ) ′ ')' ′)′ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
我们可以使用动态规划的方法来解决这道题目。我们定义一个 d p dp dp数组,其中 d p [ i ] dp[i] dp[i]表示第i个字符串结尾的最长有效括号的长度。我们从左到右遍历字符串,对于每一个字符串,如果它是 ′ ( ′ '(' ′(′, 那么 d p [ i ] dp[i] dp[i]一定是0, ′ ( ′ '(' ′(′是不能够和前面的进行配对。那么我们需要找到前面能和它配对的’('的位置,这个位置就是 i − d p [ i − 1 ] − 1 i - dp[i - 1] - 1 i−dp[i−1]−1。如果这个位置存在并且字符是 ′ ( ′ '(' ′(′,那么 d p [ i ] dp[i] dp[i]就是 d p [ i − 1 ] + 2 dp[i - 1] + 2 dp[i−1]+2,再加上 d p [ p − 1 ] dp[p - 1] dp[p−1],其中 p p p是 i − d p [ i − 1 ] − 1 i - dp[i - 1] - 1 i−dp[i−1]−1。最后,我们更新答案 a n s ans ans为所有 d p [ i ] dp[i] dp[i]中的最大值。
解题方法
1.初始化dp数组为0,ans为0。
2.从左到右遍历字符串,对于每个字符:
- 如果它是’(',那么 d p [ i ] dp[i] dp[i]一定是0。
- 如果它是’)‘,那么我们找到前面能和它配对的 ′ ( ′ '(' ′(′的位置p,如果p存在并且s[p]是’(',那么 d p [ i ] dp[i] dp[i]就是 d p [ i − 1 ] + 2 + d p [ p − 1 ] dp[i - 1] + 2 + dp[p - 1] dp[i−1]+2+dp[p−1]。
更新答案ans为所有 d p [ i ] dp[i] dp[i]中的最大值。
返回ans。
复杂度
时间复杂度:
时间复杂度: O ( n ) O(n) O(n)
空间复杂度:
空间复杂度: O ( n ) O(n) O(n)
Code
class Solution {
public int longestValidParentheses(String str) {
char[] s = str.toCharArray();
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;
if (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;
}
}