1040 Longest Symmetric String (25 分)

本文介绍了一种求解字符串中最长回文子串的算法,通过分析奇偶两种情况来找出最大长度的回文子串。算法首先检查每个字符为中心的奇数长度回文,然后检查每对相同字符为中心的偶数长度回文,最终返回最大长度。

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

 

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

C:

/*
 @Date    : 2017-12-06 19:45:37
 @Author  : 酸饺子 (changzheng300@foxmail.com)
 @Link    : https://github.com/SourDumplings
 @Version : $Id$
*/

/*
https://www.patest.cn/contests/pat-a-practise/1040
要分奇偶两种情况讨论
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int GetOddLength(char s[], int center, int l)
{
    int i;
    int thislength = 3;
    for (i = 2; center - i >= 0; i++)
    {
        if (s[center-i] == s[center+i])
        {
            thislength += 2;
        }
        else
        {
            break;
        }
    }
    return thislength;
}

int GetEvenLength(char s[], int left, int right, int l)
{
    int thislength = 2;
    int i;
    for (i = 1; left - i >= 0 && right + i < l; i++)
    {
        if (s[left-i] == s[right+i])
        {
            thislength += 2;
        }
        else
        {
            break;
        }
    }
    return thislength;
}

int main()
{
    char s[1001];
    gets(s);
    int i;
    int l = strlen(s);
    int thislength = 1, maxlength = 1;
    for (i = 1; i < l - 1; i++)
    {
        if (s[i-1] == s[i+1])
        {
            thislength = GetOddLength(s, i, l);
            if (thislength > maxlength)
            {
                maxlength = thislength;
            }
        }
    }
    for (i = 0; i < l - 1; i++)
    {
        if (s[i] == s[i+1])
        {
            thislength = GetEvenLength(s, i, i+1, l);
            if (thislength > maxlength)
            {
                maxlength = thislength;
            }
        }
    }
    printf("%d\n", maxlength);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值