1040 Longest Symmetric String (25分)

本文详细解析了求解最长回文子串问题的动态规划算法,通过实例讲解了状态转移方程,并提供了完整的C++代码实现。适用于对字符串处理和动态规划感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 题目

1040 Longest Symmetric String (25分)
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.

Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.

Output Specification:
For each test case, simply print the maximum length in a line.

Sample Input:
Is PAT&TAP symmetric?

      
    
Sample Output:
11

2 解析

2.1 题意

求最长回文子串

2.2 思路

dp[i][j]表示S[i]至S[j]所表示的子串是否是回文串,是则为1,不是为0,根据S[i]是否等于S[j],可以把转移情况分为两类,

  • 1 若S[i]==S[j],那么只要S[i+1]至S[j-1]是回文串,S[i]至S[j]就是回文子串;如果S[i+1]至S[j-1]不是回文子串,那么S[i]至S[j]也不是回文子串;
  • 2 若S[i] != S[j], 那么S[i]至S[j]一定不是回文子串
    由此得状态转移方程:
    d p [ i ] [ j ] = { d p [ i + 1 ] [ j − 1 ] , S [ i ] = S [ i ] 0 , S [ i ] ! = S [ i ] dp[i][j]=\left\{ \begin{aligned} dp[i+1][j-1],S[i] = S[i] \\ 0,S[i] != S[i] \\ \end{aligned} \right. dp[i][j]={dp[i+1][j1],S[i]=S[i]0,S[i]!=S[i]

边界:dp[i][i] = 0, dp[i][i+1] = (S[i] == S[i+1])? 1 : 0

3 参考代码

#include <cstdio>
#include <cstring>

const int MAXN = 1010;
int dp[MAXN][MAXN];
char S[MAXN];

int main(int argc, char const *argv[])
{
    fgets(S, MAXN, stdin);
    int len = strlen(S) - 1;
    int ans = 1;

    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){
                dp[i][j] = 1;
                ans = L;
            }
        }
    }

    printf("%d\n", ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星蓝雨

如果觉得文章不错,可以请喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值