题解 | #密码截取#
密码截取
http://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
笑死了,根本不会。
边界条件纯纯是往两侧头尾限制。
奇数要算上中心的任意一个(中心位置与相邻两侧是否相同不影响回文长度),所以要加一。
k从1开始是因为不用判断secret[i]位置是否是回文序列中的一个,奇数序列最中心的字母可以是任意的。
偶数么,抄的评论区大佬的,到现在也不知道那个secret[i]==secret[i+1]的限制是啥样的。
俺猜测应该是为了节省时间吧,毕竟有ABCDE这种,下面循环就不用了。
至于边界条件,纯是按照位置和头尾位置硬写出来的。
k从0开始时因为要算secret[i]本身回文情况。
#include<stdio.h>
#include<string.h>
char secret[2500];
int i=0,j=0,k=0,count=0,max=0,len;
int main()
{
scanf("%s\n",secret);
len=strlen(secret);
for(i=0;i<len;i++)//奇数
{
for(k=1;((k+i)<len)&&(i-k)>=0;k++)//secre[i]本身是最小回文序列因此从其两侧开始判断,边界条件是两侧最长不能溢出序列两端。
{
if(secret[k+i]==secret[i-k])//判断secret[i]两侧
{
count+=2;
if(count>max)//最值至少为1
{
max=count+1;
}
}
else
{
count=0;
break;
}
}
}
for(i=0;i+1<len;i++)//偶数
{
if(secret[i]==secret[i+1])//节省时间,如果相邻的都没有一样的,就不用进入以下循环
{
for(k=0;((k+i+1)<len)&&(i-k)>=0;k++)//secret[i]索引不能溢出首位索引,要考察本身,从1开始。
{
if(secret[k+i+1]==secret[i-k])//本位和下一位。
{
count+=2;
if(count>max)
{
max=count;
}
}
else
{
count=0;
break;
}
}
}
}
printf("%d",max);
}