1. 程式人生 > 實用技巧 >Luogu P1944 最長括號匹配

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; }