力扣 32. 最长有效括号

题目说明

给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

  • 提示:
    • 0 <= s.length <= 3 * 10^4
    • s[i]'('')'

示例

示例 1:

1
2
3
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

1
2
3
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

1
2
输入:s = ""
输出:0

笔者理解

此题是一道字符串算法问题,在力扣题库中被定义为困难题。

解法

当笔者阅读完此题后,直接动态规划状态转移的方法,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
/*
* 动态规划
*/
public int longestValidParentheses(String s) {
int max = 0;
int[] dp = new int[s.length()];

for (int i = 1; i < s.length(); i++) {
// 根据右括号来判定
if (s.charAt(i) == ')') {
// 当前一个符号为 ( 时, 说明此刻至少拥有一对括号, 可以从 i-2 的状态转移过来
// 诸如 () 或者 ()() 的形式
if (s.charAt(i - 1) == '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
}
// 当前一个符号为 ) 时, 判断前面对应的位置是不是 (
// 因为是从前往后计算的, 所以 (()) 这样的计算肯定在 ((())) 之前
else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
}
// 累计最大值
max = Math.max(max, dp[i]);
}
}
return max;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20210915111008675

总结

本题是今天的一题,难度是为困难,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。