题目如下
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解题代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int longestValidParentheses(string s)
{
//动态规划
/*
dp[i] 表示以i为结尾的最长匹配长度
如果i位置是'(' dp[i] = 0;
如果i位置是')' ((( (()) 7 i-2-dp[i-1] dp[6] = 2; i = 7;
*/
int len = s.length();
vector<int> dp(len + 1, 0);
dp[0] = 0;
dp[1] = 0;
int maxLen = 0;
for (int i = 2; i <= len; ++i)
{
if (s[i - 1] == ')')
{
if (i - 2 - dp[i - 1] >= 0 && s[i - 2 - dp[i - 1]] == '(')
{
dp[i] = dp[i - 1] + 2;
}
//除了这个位置匹配到还要这个位置前面的位置
dp[i] = dp[i] + dp[i - dp[i]];
}
maxLen = max(maxLen, dp[i]);
}
return maxLen;
}
int main()
{
cout << longestValidParentheses("(()") << endl;
}
方法2
class Solution//)()())
{
public:
int longestValidParentheses(string s)
{
stack<int> t;
int maxlen = 0, last = -1;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
{
t.push(i);
}
else
{
if (t.empty())
{
last = i;
}
else
{
t.pop();
if (t.empty())
{
maxlen = max(maxlen, i - last);
}
else
{
maxlen = max(maxlen, i - t.top());
}
}
}
}
return maxlen;
}
};