最长合法括号子串
现在,给定一个由
(和)组成的字符串 SS。请你求出其中的最长合法括号子串的长度以及数量。
输入格式
共一行,一个由
(和)组成的字符串。输入格式
一行两个整数,表示最长合法括号子串的长度以及数量。
如果不存在合法括号子串,则输出
0 1。
- 分析规律
- 一个匹配的合法子串,末尾必是
) - 括号匹配想到栈
- 会有多个合法的子串,要考虑这些子串是否会连起来成为更长的子串 -> 存更多信息
- 一个匹配的合法子串,末尾必是
- 解决
- 栈存
(的下标位置,这样遇到)就能得知匹配到的长度 - dp:
dp[i]表示以s[i]结尾的字符串的合法字符串长度(合法字符串包括s[i]) - \(dp[i] = dp[t - 1] + i - t + 1\)
- \(i\) 为当前
)的位置,\(t\) 为栈顶(标志
- \(i\) 为当前
- 栈存
#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;
}

浙公网安备 33010602011771号