leetcode32. 最长有效括号(栈)
作者:互联网
链接:https://leetcode-cn.com/problems/longest-valid-parentheses/
题目
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
思路
方法一
用栈记录左括号 dp数组记录能达到的最长合法字符串
class Solution {
public:
int longestValidParentheses(string s) {
int n=s.size();
if(n<2)
return 0;
vector<int>dp(n);
vector<bool>iscons(n,false);
stack<int>st;
for(int i=0;i<n;++i){
if(s[i]==')'){
if(st.empty())
continue;
else{
iscons[i]=true;
int t=st.top();
st.pop();
if(t>0&&s[t-1]==')'&&iscons[t-1]==true)
dp[i]=dp[t-1]+i-t+1;
else
dp[i]=i-t+1;
}
}else{
st.push(i);
}
}
return *max_element(dp.begin(),dp.end());
}
};
方法二
只记录左括号等于右括号的形式,但是特殊情况“(()”无法识别,故可以左右各进行一次,取最大
class Solution {
public:
int longestValidParentheses(string s) {
int n=s.size();
int left=0,right=0,ans=0;
for(int i=0;i<n;++i){
if(s[i]=='(')left++;
else right++;
if(left==right) ans=max(ans,2*left);
else if(right>left)left=0,right=0;
}
left = 0, right = 0;
for(int i=n-1;i>=0;--i){
if(s[i]==')')right++;
else left++;
if(left==right) ans=max(ans,2*right);
else if(left>right)left=0,right=0;
}
return ans;
}
};
标签:right,int,括号,ans,leetcode32,最长,dp,left 来源: https://www.cnblogs.com/kitamu/p/15549709.html