动态规划解法,dp[i]表示以i为开始的最长有效括号字符串的长度,
只有以'('开始有可能出现有效括号串,对于每一个'('来说,要凑出一个有效的括号字符串 肯定是'('+一段有效的括号字符串+')' +一段有效的括号字符串

#include<iostream>

using namespace std;

const int MAXN = 1e5+10;
int main()
{
    string s;
    cin >> s;
    int ans = 0;
    int dp[MAXN]={0};
    for(int i = s.length()-2 ; i >= 0 ; i--)
    {
        if(s[i]=='(')
        {
            int next = i+dp[i+1]+1;//去掉左括号+一段有效的括号字符串之后的位置
            if(next <s.length() && s[next]==')')//+')'
            {
                dp[i] = dp[i+1]+2;
                if(next+1 <s.length()){dp[i]+=dp[next+1];}//加后面的一段有效的括号字符串
            }
        }
        ans = max(ans,dp[i]);
    }
    cout<<ans<<endl;
    return 0;
}

栈解法:顺序遍历字符串,对于每一个字符来说,如果是'('就入栈,如果是')'并且栈顶是'(',那就出栈,并且记一下当前的长度。

#include<iostream>
#include<stack>
using namespace std;
struct node{
    char c;
    int index;
};
const int MAXN= 1e5+10;
int main()
{
    string s;
    cin >> s;
    stack<node> S;
    int ans = 0;
    for(int i = 0 ;i < s.length();i++)
    {
        if(s[i]==')'&&!S.empty()&&S.top().c=='(')
        {
                S.pop();
                int b = 0;
                if(!S.empty()){ans = max(ans,i-S.top().index);}
                else{ans = i+1;}
        }
        else{S.push(node{s[i],i});}
    }
    cout<<ans<<endl;
    return 0;
}