最长合法括号子串
现在,给定一个由
(
和)
组成的字符串 SS。请你求出其中的最长合法括号子串的长度以及数量。
输入格式
共一行,一个由
(
和)
组成的字符串。输入格式
一行两个整数,表示最长合法括号子串的长度以及数量。
如果不存在合法括号子串,则输出
0 1
。
- 分析规律
- 一个匹配的合法子串,末尾必是
)
- 括号匹配想到栈
- 会有多个合法的子串,要考虑这些子串是否会连起来成为更长的子串 -> 存更多信息
- 一个匹配的合法子串,末尾必是
- 解决
- 栈存
(
的下标位置,这样遇到)
就能得知匹配到的长度 - dp:
dp[i]
表示以s[i]
结尾的字符串的合法字符串长度(合法字符串包括s[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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】