给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号 子串 的长度。 请使用c++的dfs来解答
时间: 2024-09-11 13:18:59 浏览: 78
给定一个仅包含圆括号 '(' 和 ')' 的字符串,你可以使用深度优先搜索(DFS)算法来寻找最长的有效括号子串。这里是一个简单的C++代码实现:
```cpp
#include <iostream>
#include <vector>
std::string longestValidParentheses(const std::string &s) {
int max_len = 0;
int dp[2] = {0}; // 左指针位置和匹配状态,0表示左括号未匹配,1表示已匹配
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '(') {
dp[0]++;
} else {
dp[0]--;
if (dp[0] < 0) {
dp[0] = 0;
} else {
max_len = std::max(max_len, i - dp[0]);
}
}
}
// 右边界处理,检查是否存在未配对的右括号
int right_bracket_count = 0;
for (int i = s.length() - 1; i >= 0; --i) {
if (s[i] == ')') {
right_bracket_count++;
} else {
break;
}
}
if (right_bracket_count > dp[0]) {
max_len += right_bracket_count - dp[0];
}
return max_len + 1; // 返回结果加一,因为我们需要括号对的数量
}
int main() {
std::string s = "(()";
std::cout << "Longest valid parentheses length: " << longestValidParentheses(s) << std::endl;
return 0;
}
```
这个函数`longestValidParentheses`通过维护一个动态规划数组`dp`来跟踪当前左括号的位置和是否匹配的状态。对于每个字符,如果遇到右括号,就尝试找到最长的有效子串;如果遇到左括号但无法匹配,从当前位置开始重新计算最大长度。
最后,遍历整个字符串的反向部分,检查是否有未匹配的右括号,将它们加入到最长子串中。
阅读全文