链接:https://ac.nowcoder.com/acm/problem/14517
来源:牛客网
回文串
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
既然大家都知道回文串是怎么回事了,那我们就长话短说,现在有一个字符串,长度小于1200,我想知道最长的回文子串长度是多少。
输入描述:
多组输入,输入字符串只包含小写字母。
输出描述:
每组输出一个数字,表示最长的回文子串。
示例1
输入
复制
aqppqole
ebcml
输出
复制
4
1
#include <stdio.h>
#include <string.h>
int main()
{
char w[1210];
int i,len,max,j,k,x,y;
while(scanf("%s",w)!=EOF)
{
int a[1210]={1},b[1210]={0};//a全部为一 表示回文串至少为1 b全部置0
len=strlen(w);//得到字符串长度
for(i=0;i<len;i++)//找奇数回文子串
{
j=i-1;//子串是回文的话至少长度为三
k=i+1;
while(j>=0 && k<len && w[j]==w[k])//先找到最小的是回文的串 再判断更多的
{
a[i]=k-j+1;
j--;//找有五位时是否还为回文字符串
k++;
}
}
首先咱们开始分析奇数子串,在定义的时候我们选择给a数组全部赋值为1,因为子串至少为一,方便后面输出,b数组是找偶数子串的,后面会有解释,如果我们要找更大的奇数子串,至少子串长度就是3了,让j=i-1,k=i+1可以达到最小长度,当然我们找的时候j至少就要大于等于0了,k当然要小于字符串长度,当w[j]==w[k]时,我们知道这是一个子串,用a记录其长度,让j–,k++,再判断长度为5时是不是还是回文串即可,偶数的略有不同,看代码就明白;
#include <stdio.h>
#include <string.h>
int main()
{
char w[1210];
int i,len,max,j,k,x,y;
while(scanf("%s",w)!=EOF)
{
int a[1210]={1},b[1210]={0};//a全部为一 表示回文串至少为1 b全部置0
len=strlen(w);//得到字符串长度
for(i=0;i<len;i++)//找奇数回文子串
{
j=i-1;//子串是回文的话至少长度为三
k=i+1;
while(j>=0 && k<len && w[j]==w[k])//先找到最小的是回文的串 再判断更多的
{
x=j;
y=k;
a[i]=k-j+1;
j--;//找有五位时是否还为回文字符串
k++;
}
}
for(i=0;i<len;i++)//偶数回文找法
{
j=i;
k=i+1;
while(j>=0 && k<len && w[j]==w[k])
{
b[i]=k-j+1;
j--;//先看中间是不是回文 再看两边
k++;
}
}
max=1;
for(i=0;i<len;i++)
{
if(max<a[i])
max=a[i];
if(max<b[i])
max=b[i];
}
printf("%d\n",max);
}
}