1040最長対称文字列(25ポイント)[最長回文部分文字列]

文字列が与えられると、最も長い対称部分文字列の長さを出力することになっています。たとえば、Is PAT&TAP symmetric?の場合、最長の対称部分文字列はs PAT&TAPであるため、11を出力する必要があります。

入力仕様:
各入力ファイルには、1000以下の長さの空でない文字列を与える1つのテストケースが含まれています。

出力仕様:
各テストケースについて、最大長を1行に印刷するだけです。

サンプル入力:

Is PAT&TAP symmetric?

サンプル出力:
11
これはテンプレート質問
ACコードです:

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
char s[N];
int dp[N][N];//存的是i到j是否为回文串 而不是回文串长度
//思想是:如果dp[i][j] = 1 就去检查dp[i+1][j-1] 如果还是回文串耐久继续检查
//倘若不检查过程中存在不满足的那就不是回文串
int main()
{
    
    
    fgets(s, N, stdin);
    int ans = 1;
    int len = strlen(s);
    //先初始化边界
    for(int i = 0; i < len ; i++)
    {
    
    
        dp[i][i] = 1;
        if(i < len-1)
        {
    
    
             if(s[i] == s[i+1])
        {
    
    
            dp[i][i+1] = 1;
            ans = 2;//初始化回文子串长度
        }
        }
    }

    for(int L = 3; L <= len; L++)
    {
    
    
        for(int i = 0; i + L - 1 < len; i++)
        {
    
    
            int j = i + L - 1;
            if(s[i] == s[j] && dp[i + 1][j - 1] == 1)//一点一点向外扩充 字符串长度为2的已经在初始化的时候判断成功
            {
    
    
                dp[i][j] = 1;
                ans = L; //更新最长回文字串长度
            }
        }
    }
    cout << ans << endl;
    return 0;
}

おすすめ

転載: blog.csdn.net/moumoumouwang/article/details/108948916
おすすめ