最长合法括号子串

原题链接

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

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

输入格式

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

输入格式

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

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

  • 分析规律
    • 一个匹配的合法子串,末尾必是 )
    • 括号匹配想到栈
    • 会有多个合法的子串,要考虑这些子串是否会连起来成为更长的子串 -> 存更多信息
  • 解决
    • 栈存 ( 的下标位置,这样遇到 ) 就能得知匹配到的长度
    • dp:dp[i] 表示以 s[i] 结尾的字符串的合法字符串长度(合法字符串包括s[i]
    • \(dp[i] = dp[t - 1] + i - t + 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 @ 2022-01-09 18:37  攻城熊  阅读(264)  评论(0)    收藏  举报