• 15回文相关问题


        回文指一个顺着读和反过来读都一样的字符串,比如 madam、我爱我。回文判断是一类典型的问题,尤其是与字符串结合后呈现出多姿多彩。

     

    一、回文判断

        如何判断一个字串是否是回文,最直接的方法显然是将字符串逆转,存入另外一个字符串,然后比较原字符串和逆转后的字符串是否一样,一样就是回文,这个方法的时空复杂度都是 O(n)。

        很容易想到只要从两头开始同时向中间扫描字串,如果直到相遇,两端的字符都一样,那么这个字串就是一个回文。我们只需要维护头部和尾部两个扫描指针即可。这样的算法,时间复杂度为O(n),空间复杂度为O(1)。已经达到了最佳的性能。代码如下:

    int isHuiWen(char *buf, int len)

    {

             inti, j;

             assert(buf);

     

             i= 0; j = len-1;

             while(i< j)

             {

                      if(buf[i++]!= buf[j--])

                      {

                              return0;

                      }

             }

             return1;

    }

     

           或者从中间开始向两边扫描,考虑到字符串的长度有奇偶数的区分,所以,中间元素也有两种情况,代码如下:

    int isHuiWen2(char * buf,int len)

    {

             int  i, j;

             assert(buf);

             if(len% 2 != 0)                  //长度为奇数的情况

             {

                      i= len/2;

                      j= len/2;

             }

             else                            //长度为偶数的情况

             {

                      j= len/2;

                      i= j-1;

             }

     

             while(i>=0&& j<len)

             {

                      if(buf[i--]!= buf[j++])

                      {

                              return0;

                      }

             }

             return1;

    }

     

    二:最长回文子串

        如果需要查找一个字符串中的最长回文字串,那么如何高效的进行判断呢?可以利用上一节中的第二种思路,从一个字符开始,向两边扩展,看看最多能到多长,使其保持为回文。这也就是为什么在上一节里面要提出isHuiWen2的原因。

        具体而言,可以枚举中心位置,然后再在该位置上用扩展法,记录并更新得到的最长的回文长度,即为所求。扩展法需要考虑两种情况,举例来说就是:”abc”和”abbc”的情况。代码如下:

             for(k= 0; k < len; k++)

             {

                      i= k;

                      j= k;

                      huiwenlen= 0;

                      while(i>= 0 && j < len)

                      {

                              if(buf[i]== buf[j])

                              {

                                       huiwenlen= j - i + 1;

                              }

                              else

                              {

                                       break;

                              }

                              i--;

                              j++;

                      }

                      if(maxhuiwenlen< huiwenlen)

                      {

                              index1= i+1;

                              index2= j-1;

                              maxhuiwenlen= huiwenlen;

                      }

     

                      i= k;

                      j= k+1;

                      huiwenlen= 0;

                      while(i>= 0 && j < len)

                      {

                              if(buf[i]== buf[j])

                              {

                                       huiwenlen= j - i + 1;

                              }

                              else

                              {

                                       break;

                              }

                              i--;

                              j++;

                      }

                      if(maxhuiwenlen< huiwenlen)

                      {

                              index1= i+1;

                              index2= j-1;

                              maxhuiwenlen= huiwenlen;

                      }

     

             }

     

             printf("themax huiwen len is %d ", maxhuiwenlen);

             printf("thelongest huiwen is: ");

             for(i= index1; i <= index2; i++)

             {

                      printf("%c",buf[i]);

             }

             printf(" ");

     

    (http://blog.csdn.net/v_july_v/article/details/6712171)

  • 相关阅读:
    GitHub Android Libraries Top 100 简介
    GitHub Top 100 的项目(iOS)
    iOS 学习资源
    HTTP和GET/POST请求(NSURLConnection)
    RunLoop
    HTML5 拖放
    网络安全与加密
    Cocoapods的安装
    iOS中的单例模式
    SDWebImage
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247172.html
Copyright © 2020-2023  润新知