P1944 最長括號匹配(棧模擬/DP)

P1944 最長括號匹配
在這裏插入圖片描述
可以直接用棧模擬,把匹配好的標記一下, 最後找到最長的匹配輸出即可。

如果是要求最長的長度的題那麼只需要求數就行了,沒必要把原序列真的按照題意改變

如果要求序列,那麼只需要按照題意把答案標記出來輸出即可,沒必要真的一段一段找。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<stack>

#define ls (p<<1)
#define rs (p<<1|1)
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
#define lowbit(p) p&(-p)
using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N = 1000100;
const int mod = 1e4+7;
const double EPS = 1e-10;
const int base = 131;
int cnt,l,ansl,ansr;
string str;
int stk[N][2];
int n,m,top;
bool vis[N];
int main()
{
    cin>>str;
    int len = str.length();
    over(i,0,len-1){
        char ch =str[i];
        if((ch == ']'&&stk[top][0] == '[')||(ch == ')'&&stk[top][0] == '('))vis[stk[top--][1]] = vis[i] = 1;
        else stk[++top][0] = ch,stk[top][1] = i;
    }
    int ans = 0;
    over(i,0,len-1)
        if(!vis[i])cnt = 0,l = i+1;
        else {
            cnt++;
            if(cnt >ans)
            ans = cnt,ansl = l,ansr = i;
        }
    over(i,ansl,ansr)putchar(str[i]);
    return 0;
}

大佬們都是用DP做的:

//我們可以用dp【i】表示以i結尾的最長合法序列長度
//那麼對於每一個元素,只需考慮它的上一個元素的長度即可
//就有dp方程:dp[i]=dp[i-1]+2+dp[i-2-dp[i-1]];
//以下是代碼:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
char st[maxn];
int ans;
int dp[maxn];
int main()
{
    scanf("%s",st+1);int len=strlen(st+1);
    for(int i=1;i<=len;i++)
    {
        if(st[i]=='(' || st[i]=='[')continue;
        if(st[i]==')' || st[i]==']')
        {
            if((st[i]==')' && st[i-1-dp[i-1]]=='(') || (st[i]==']' && st[i-1-dp[i-1]]=='['))
            {
                dp[i]=dp[i-1]+2+dp[i-2-dp[i-1]];
                ans=max(ans,dp[i]);
            }
        }
    }
    for(int i=1;i<=len;i++)
        if(dp[i]==ans)
        {
            for(int j=i-ans+1;j<=i;j++)printf("%c",st[j]); return 0;
        }
}
//https://www.luogu.com.cn/blog/user25365/solution-p1944

注:如果您通過本文,有(qi)用(guai)的知識增加了,請您點個贊再離開,如果不嫌棄的話,點個關注再走吧,日更博主每天在線答疑 ! 當然,也非常歡迎您能在討論區指出此文的不足處,作者會及時對文章加以修正 !如果有任何問題,歡迎評論,非常樂意爲您解答!( •̀ ω •́ )✧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章