Luogu P1944 最长括号匹配
Dp很好想,下面普及一种不用DP的方法
每次,将可以配对的标记成1,最后求最长的连续1片段
坑:字符串取strlen每次调用O(n),所以不要作为终止条件,会不知不觉变成O(N^2)
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; bool vis[N]; int top,st[N]; char s[N]; int main() { scanf("%s",s); int n=strlen(s); for(int i=0;i<n;i++) { if(s[i]==']'||s[i]==')') { if(top) { if(s[st[top]]=='['&&s[i]==']'||s[st[top]]=='('&&s[i]==')') { vis[st[top]]=1,top--; vis[i]=1; } else top=0; } } else st[++top]=i; } int l=1,r=0,now=0; for(int i=0;i<n;i++) { if(vis[i]) now++; else { if(r-l+1<now) { r=i-1,l=i-now; } now=0; } } for(int i=l;i<=r;i++) { putchar(s[i]); } return 0; }

浙公网安备 33010602011771号