最长合法括号子串

原题链接

现在,给定一个由 () 组成的字符串 SS。

请你求出其中的最长合法括号子串的长度以及数量。

输入格式

共一行,一个由 () 组成的字符串。

输入格式

一行两个整数,表示最长合法括号子串的长度以及数量。

如果不存在合法括号子串,则输出 0 1

  • 分析规律
    • 一个匹配的合法子串,末尾必是 )
    • 括号匹配想到栈
    • 会有多个合法的子串,要考虑这些子串是否会连起来成为更长的子串 -> 存更多信息
  • 解决
    • 栈存 ( 的下标位置,这样遇到 ) 就能得知匹配到的长度
    • dp:dp[i] 表示以 s[i] 结尾的字符串的合法字符串长度(合法字符串包括s[i]
    • dp[i]=dp[t1]+it+1
      • i 为当前 ) 的位置,t 为栈顶 ( 标志
#include <bits/stdc++.h>

using namespace std;

const int N = 1000010;

int dp[N];

int main()
{
    string s;
    cin >> s;

    int maxlen = 0, cnt = 1;
    stack<int> stk;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == '(') stk.push(i);
        else if(stk.size())
        {
            int t = stk.top();
            stk.pop();

            if(t > 0) dp[i] = dp[t - 1];
            dp[i] += i - t + 1;

            if(dp[i] == maxlen) cnt++;
            else if(dp[i] > maxlen) maxlen = dp[i], cnt = 1;
        }
    }

    cout << maxlen << " " << cnt << endl;
}
posted @   攻城熊  阅读(250)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示