题解 | #密码截取#

密码截取

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); 
  
}



全部评论
secret[i]==secret[i+1] 因为是偶数,所以这是以相邻两个字符相同为种子点向外扩展的
点赞 回复 分享
发布于 2022-04-14 14:57

相关推荐

努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
想润的芹菜人狠话不多:把其中一个老总放中间都会得罪另一个
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务