PTA-最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

分析:

  • 首先,定义一个字符数组 str 来存储输入的字符串,并定义一个整数变量 max 用于存储最长回文子串的长度,初始化为1(因为空字符串也是回文子串)。

  • 使用 gets() 函数获取用户输入的字符串,并使用 strlen() 函数计算字符串的长度。

  • 通过三重循环进行字符串的回文子串查找:

    • 第一重循环 i 从0到n(字符串长度)遍历整个字符串。
    • 第二重循环 j 从字符串的尾部开始,向前遍历到位置 i
    • 第三重循环 k 从0开始,用于比较字符串的中间部分。这个循环只有当 i+k 小于 j-k 时才会运行,这确保了我们只检查回文子串的中心部分。
  • 在内部循环中,我们检查 str[i] 和 str[j] 是否相等。如果它们相等,我们进入一个更深入的循环来检查字符串的两端是否相等。如果它们也相等,我们更新 max,如果 max 小于 j-i+1,则将其更新为 j-i+1

  • 如果在任何时候我们发现字符串的两端不相等,我们就跳出内部循环并进入下一个外部循环迭代。

  • 最后,我们打印出 max,这是最长回文子串的长度。

代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char str[1001];
    gets(str);
    int max,i,j,k,n;
    max=1;					//最短为1,而不是0
    n=strlen(str);			//字符串长度
    
    for(i=0;i<=n;i++)
    {
        for(j=n;j>i;j--)
        {
            if(str[i]==str[j])
            {
                for(k=0;i+k<=j-k;k++)
                {
                    if(i+k<j-k)
                    {
                        if(str[i+k]==str[j-k])
                        {
                            if(i+k+1==j-k)		//偶数情况
                            {
                                if(max<j-i+1)
                                    max=j-i+1;
                            }
                            else
                            	continue;
                        }
                        
                        else
                            break;
                    }
                    
                    else{
                        if(max<j-i+1)
                            max=j-i+1;
                    }
                }
            }
        }
    }
        printf("%d",max);
}

总结: 

这段代码使用了一个不再建议使用的函数 gets(),因为它可能导致缓冲区溢出。建议使用 fgets() 代替。同时,这段代码没有考虑字符是大写或小写的情况,所以可能会产生一些不精确的结果。如果要更精确的结果,可以转换为小写(或大写)并进行比较。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值