32. 最长有效括号
题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
方法1:
借用STL里的stack来记录
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int i, start = 0;
int res = 0;
string s;
stack<int> p;
cin >> s;
for (i = 0; i < s.size(); ++i)
{
if (s[i] == '(')
{
p.push(i);
}
else if (s[i] == ')')
{
if (p.empty())
start++;
else
{
p.pop();
res = p.empty() ? max(res, i - start + 1) : max(res, i - p.top());
}
}
}
printf("%d\n", res);
return 0;
}
方法二:
动态规划,把方程写出即可
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
int i, res = 0;
cin >> s;
s = s + ')';
vector<int> dp(s.size(), 0);
for (i = 1; i < s.size(); ++i)
{
if (s[i] == ')')
{
if (s[i - 1 - dp[i - 1]] == '(')
dp[i] = dp[i - 1] + 2;
}
dp[i] += dp[i - dp[i]];
res = max(res, dp[i]);
}
printf("%d\n", res);
return 0;
}
一组测试样例:
输入:
(((((()))((()(()))
输出:
16