题目
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
分析
可以使用动态规划的方法来解决这个问题。我们定义一个数组 dp
,其中 dp[i]
表示以 s[i]
结尾的最长有效括号子串的长度。
动态规划
代码解释
初始化 :n
为字符串 s
的长度。dp
数组初始化为 0,长度为 n
。maxLength
用于记录最长有效括号子串的长度,初始化为 0。
动态规划过程:
- 遍历字符串
s
,从第二个字符开始(因为第一个字符不可能组成有效括号子串)。 - 如果当前字符是
)
:- 情况一:如果前一个字符是
(
,则可以与前一个字符组成一对有效括号。此时dp[i]
等于dp[i - 2]
(如果i >= 2
)加上 2。 - 情况二:如果前一个字符也是
)
,则需要检查更前面的字符是否能组成有效括号。如果i - dp[i - 1] > 0
且s[i - dp[i - 1] - 1] == '('
,则dp[i]
等于dp[i - 1]
加上dp[i - dp[i - 1] - 2]
(如果i - dp[i - 1] >= 2
)再加上 2。
- 情况一:如果前一个字符是
- 更新
maxLength
为dp[i]
和maxLength
中的较大值。
返回结果:
- 最后返回
maxLength
,即最长有效括号子串的长度。
时间复杂度:O(),
是字符串的长度
空间复杂度:O()
cpp
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.length();
if (n == 0) return 0;
// dp[i] 表示以 s[i] 结尾的最长有效括号子串的长度
vector<int> dp(n, 0);
int maxLength = 0;
for (int i = 1; i < n; ++i) {
if (s[i] == ')') {
if (s[i - 1] == '(') {
// 如果当前字符是 ')' 且前一个字符是 '(',则可以与前一个字符组成一对有效括号
dp[i] = (i >= 2? dp[i - 2] : 0) + 2;
} else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {
// 如果当前字符是 ')' 且前一个字符也是 ')',则需要检查更前面的字符是否能组成有效括号
dp[i] = dp[i - 1] + (i - dp[i - 1] >= 2? dp[i - dp[i - 1] - 2] : 0) + 2;
}
maxLength = max(maxLength, dp[i]);
}
}
return maxLength;
}
};