zoukankan      html  css  js  c++  java
  • 最大回文子串(忽略标点和空格)

    代码

     1 //最小回文子串,忽略标点和空格
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<ctype.h>
     5 #define MAXN 5000+10
     6 
     7 char buf[MAXN],s[MAXN];
     8 int p[MAXN];
     9 int main()
    10 {
    11     int n,m=0;
    12     fgets(buf,sizeof(s),stdin);
    13     n=strlen(buf);
    14     for(int i=0;i<n;i++)
    15     {
    16         if(isalpha(buf[i]))
    17         {
    18             p[m]=i;
    19             s[m++]=toupper(buf[i]);
    20         }
    21     }
    22     printf("%s
    ",s);
    23     
    24     int max=0,x=0,y=0;
    25     
    26 
    27     //未优化方法
    28     /*for(i=0;i<m;i++)            //用这种方式需要三重循环,且看下面的另一种方式
    29     {
    30 
    31         for(int j=i;j<m;j++)
    32         {
    33             int ok=1,k;
    34             for(k=0;k<=(j-i)/2;k++)
    35             {
    36                 if(s[i+k]!=s[j-k])
    37                 {
    38                     ok=0;
    39                     break;
    40                 }
    41             }
    42             if(ok&&j-i+1>max)
    43             {
    44                 max=j-i+1;
    45                 x=p[i];
    46                 y=p[j];
    47             }
    48         }
    49     }*/
    50 
    51     //优化方法
    52     for(i=0;i<m;i++)   //这种以i为中心,向两边扩展检测的方式只需二重循环,但要分奇偶两次内循环
    53     {
    54         int k;
    55         for(k=0;i-k>=0&&i+k<m;k++)//回文串有奇数个,s[i]出于回文串中间
    56         {
    57             if(s[i-k]!=s[i+k]) break;        // if(s[i-k]!=s[i+k])
    58                                              // {
    59             if(2*k+1>max)                    //        if(2*(k-1)+1>max)
    60             {                                //        {
    61                 max=2*k+1;                   //            max=2*(k-1)+1;
    62                 x=p[i-k];                    //            x=p[i-(k-1)];
    63                 y=p[i+k];                    //            y=p[i+(k-1)];
    64             }                                //        }
    65                                              //        break;
    66                                              // }   如果写成这种语句块,当最大回文串出现在开头或者结尾处时,由于for循环首先判断出i-k<0或者i+k>m,
    67         }                                    //     致使循环for循环直接结束,无法进入if(2*(k-1)+1>max)语句块,使得max,x,y更新失败,出现错误
    68         
    69         for(k=0;i-k>=0&&i+k+1<m;k++) //回文串有偶数个,s[i]出于回文串中间偏左
    70         {
    71             if(s[i-k]!=s[i+k+1]) break;        // if(s[i-k]!=s[i+k+1])
    72                                                // {
    73             if(2*k+2>max)                      //        if(2*(k-1)+2>max)
    74             {                                 //        {
    75                 max=2*k+2;                     //            max=2*(k-1)+2;
    76                 x=p[i-k];                     //            x=p[i-(k-1)];
    77                 y=p[i+k+1];                    //            y=p[i+(k-1)+1];
    78             }                                  //        }
    79                                                //        break;
    80                                                // } 错误原因同上。
    81         }
    82     }
    83 
    84 
    85 
    86     printf("最长回文子串为(仅字符长度):%d
    ",max);
    87     for(i=x;i<=y;i++) putchar(buf[i]);
    88     putchar('
    ');
    89     return 0;
    90 }

  • 相关阅读:
    理解HTTP幂等性
    企业技术树
    数据库MySQL-Oracle-DB2-SQLServer分页查询
    Redis安装教程
    Redis VS Memcached
    Redis简介
    Redis系列文章导读
    坐标轴
    图例
    画网格
  • 原文地址:https://www.cnblogs.com/bboykaku/p/12629867.html
Copyright © 2011-2022 走看看