☀L2-008最長の対称部分文字列(25ポイント)[PTA] [暴力]

特定の文字列について、この質問では、最長の対称部分文字列の長さを出力する必要があります。たとえばIs PAT&TAP symmetric?、最長の対称部分文字列がであるとするとs PAT&TAP s、11を出力する必要があります。

入力フォーマット:

1000を超えない空でない文字列を1行に入力します。

出力フォーマット:

最長の対称部分文字列の長さを1行で出力します。

入力サンプル:

Is PAT&TAP symmetric?

サンプル出力:

11

馬車を使わずに最長の対称部分文字列を解決するためのより暴力的な方法です。それを見ると、dpの使用方法もわかりました。

int max = 1; //★★★★★空でない文字列。最短の対称部分文字列の長さは1です。それ以外の場合、サンプルには1つあります。

---------------------

部分文字列が対称である場合

forint i = 0; i <len; i ++)

    {{

        int x = i、y = i + 1;

        int年= 0;

        while(s [x] == s [y] && x> = 0 && y <len)

        {{

            バツ - ;

            および++;

            年+ = 2;

        }

        if(ans> max)

        {{

            最大=年;

        }

    }

---------------------

部分文字列が奇妙に対称である場合

forint i = 1; i <len; i ++)

    {{

        int x = i-1、y = i + 1;

        int ans = 1; //最初に中央に文字を追加する答え

        while(s [x] == s [y] && x> = 0 && y <len)

        {{

            バツ - ;

            および++;

            年+ = 2;

        }

        if(ans> max)

        {{

            最大=年;

        }

    }

ACコード:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;

int main()
{
    string s;
    getline(cin,s);
    int len=s.size();
    int max=1;
    for(int i=0;i<len;i++)
    {
        int x=i,y=i+1;
        int ans=0;
        while(s[x]==s[y]&&x>=0&&y<len)
        {
            x--;
            y++;
            ans+=2;
        }
        if(ans>max)
        {
            max=ans;
        }
    }
    for(int i=1;i<len;i++)
    {
        int x=i-1,y=i+1;
        int ans=1;
        while(s[x]==s[y]&&x>=0&&y<len)
        {
            x--;
            y++;
            ans+=2;
        }
        if(ans>max)
        {
            max=ans;
        }
    }
    cout<<max;
    return 0;
}

参照:https//blog.csdn.net/qq_34115899/article/details/79680882?ops_request_misc =%257B%2522request%255Fid%2522%253A%2522160629601719195283012726%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog 。%2522%257D&request_id = 160629601719195283012726&biz_id = 0&utm_medium = Distribute.pc_search_result.none-task-blog-2〜blog〜first_rank_v1〜rank_blog_v1-26-79680882.pc_v1_rank_blog_v1&utm_term = L ++ 8.2118ポイント最長&対称 

 

馬車アルゴリズム

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000
using namespace std;

char s[MAX + 1];
char t[MAX * 2 + 5] = {'@','#'};
int p[MAX * 2 + 5];
int Manacher(char *str) {
    int len = strlen(str);
    for(int i = 1;i <= len;i ++) {
        t[i * 2] = str[i - 1];
        t[i * 2 + 1] = '#';
    }
    t[len * 2 + 2] = 0;
    int mi = 0,rpoint = 0,mr = 0;
    for(int i = 1;t[i];i ++) {
        p[i] = i < rpoint ? min(rpoint - i,p[mi * 2 - i]) : 1;
        while(t[i + p[i]] == t[i - p[i]]) p[i] ++;
        if(i + p[i] > rpoint) {
            mi = i;
            rpoint = i + p[i];
        }
        if(mr < p[i]) mr = p[i];
    }
    return mr - 1;
}
int main() {
    int i = 0;
    while((s[i] = getchar()) != '\n') i ++;
    s[i] = 0;
    printf("%d",Manacher(s));
}

 

おすすめ

転載: blog.csdn.net/qq_43660826/article/details/110150945