[Luogu1944] 最长括号匹配
Description
对一个由(,),[,]括号组成的字符串,求出其中最长的括号匹配子串。具体来说,满足如下条件的字符串成为括号匹配的字符串:
-
(),[]是括号匹配的字符串。
-
若A是括号匹配的串,则(A),[A]是括号匹配的字符串。
-
若A,B是括号匹配的字符串,则AB也是括号匹配的字符串。
例如:(),[],([]),()()都是括号匹配的字符串,而][,[(])则不是。
字符串A的子串是指由A中连续若干个字符组成的字符串。
例如,A,B,C,ABC,CAB,ABCABCd都是ABCABC的子串。空串是任何字符串的子串。
Input
输入一行,为一个仅由()[]组成的非空字符串。
Output
输出也仅有一行,为最长的括号匹配子串。若有相同长度的子串,输出位置靠前的子串。
Sample Input1
([(][()]]()
Sample Output1
[()]
Sample Input2
())[]
Sample Output2
()
Hint
对20%的数据,字符串长度<=100.
对50%的数据,字符串长度<=10000.
对100%的数据,字符串长度<=1000000.
题解
对于这题
最长,可见这是道最值问题
最值问题可以用贪心,
我对于这题用的是
进入正题:如何
首先,我们需要构建状态,状态的构建不是唯一的,我是这样构建的
令
接下来,我们就得推状态转移方程
考虑(
或者[
那么)
或者]
时我们应该怎样转移呢?
我们要找到一个(
(或者[
,为了方便叙述,下同),使得在
那么什么情况能满足上面的条件呢?
说明一下
代表 与 中间的一段即 的最长括号匹配 即 与 匹配,增加长度为 即 的前一个字符,这里不要漏掉它还可以构成的最长括号匹配的长度- 不是很复杂,画个图就很明显了
那么若
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int L=1000005;
char s[L];
int l,f[L],Ans,id;
int main()
{
scanf("%s",s+1);
l=strlen(s+1);
for(int i=2;i<=l;++i)
if(s[i]=='('||s[i]=='[') continue;
else
if((s[i]==')'&&s[i-f[i-1]-1]=='(')
||(s[i]==']'&&s[i-f[i-1]-1]=='['))
{
f[i]=f[i-1]+2+f[i-f[i-1]-2];
if(f[i]>Ans) Ans=f[i],id=i;
}
for(int i=id-Ans+1;i<=id;++i) printf("%c",s[i]);
putchar('\n');
return 0;
}
本文作者:OItby @ https://www.cnblogs.com/hihocoder/
未经允许,请勿转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!