zoukankan      html  css  js  c++  java
  • 最大长度回文子串(Manacher's algorithm)

    输出最大长度的回文子串。

     1 string longestPalindrome(string s)
     2 {
     3 
     4 
     5     int id, mx, i, j, len, maxlen;
     6     vector<char> cvec;
     7     vector<int> ivec;
     8     string str;
     9     int ma, k;
    10 
    11     id = 0;
    12     mx = 0;
    13     ivec.push_back(1);
    14     len = s.size();
    15     maxlen = 2*s.size() + 1;
    16 
    17     for (i = 0; i < len; ++i)
    18     {
    19         cvec.push_back('#');
    20         cvec.push_back(s[i]);
    21     }
    22     cvec.push_back('#');
    23 
    24 
    25     for (i = 1; i < maxlen; ++i)
    26     {
    27         if (mx > i)
    28         {
    29             int temp;
    30             temp = ((mx - i - 1) > (ivec[2*id - i])) ? (ivec[2*id - i]) : (mx - i - 1);
    31             ivec.push_back(temp);
    32         }
    33         else
    34             ivec.push_back(1); 
    35 
    36         for (; (i - ivec[i] >= 0) && ((i + ivec[i]) < maxlen) && (cvec[i-ivec[i]] == cvec[i+ivec[i]]); ++ivec[i])
    37             ;
    38 
    39         if (mx < ivec[i] + i -1 )
    40         {
    41             mx = ivec[i] + i - 1;
    42             id = i;
    43         }
    44     }
    45 
    46     ma = 0;
    47     for (i = 0; i < maxlen; ++i)
    48     {
    49         if (ivec[i] > ma)
    50         {
    51             ma = ivec[i];
    52             k = i;
    53         }
    54     }
    55 
    56     for (j = 0, i = k - ivec[k] + 1; j < ivec[k] - 1; ++i, ++j)
    57     {
    58         ++i;
    59         str.push_back(cvec[i]);
    60     }
    61     
    62     return str;
    63 }

     对于判断一个整数是否是回文,有另外的方法,不需要另外开辟空间。把地位当做高位,计算其值。

    比如:123,计算3*100 + 2*10 + 1 的值是否与123相等。代码如下:

     1 void isPalindrome(int integer)
     2 {
     3     int temp, count, num, digit;
     4 
     5     if (integer < 0)
     6     {
     7         printf("不是回文整数
    ");
     8         return;
     9     }
    10     if (integer == 0)
    11     {
    12         printf("是回文整数
    ");
    13         return;
    14     }
    15 
    16     temp = integer;
    17     count = 0;
    18     while (temp)
    19     {
    20         count++;
    21         temp = temp / 10;
    22     }
    23 
    24     temp = integer;
    25     num = 0;
    26     while (temp > 0)
    27     {
    28         digit = temp - (temp / 10) * 10;
    29         num = digit * int_pow(count) + num;
    30         temp = temp / 10;
    31         count--;
    32     }
    33 
    34     if (num == integer)
    35     {
    36         printf("是回文整数
    ");
    37     }
    38     else
    39     {
    40         printf("不是回文整数
    ");
    41     }
    42 
    43 }
    44 
    45 int int_pow(int x)
    46 {
    47     int result = 1;
    48 
    49     while (x > 1)
    50     {
    51         result = result * 10;
    52         x--;
    53     }
    54     return result;
    55 }
  • 相关阅读:
    GO make&new区别
    GO 包相关
    GO 类型断言
    栈 队列 链表
    表达式求值
    动态规划 最长子序列
    04 单例模式
    02 简单工厂模式
    java设计模式 01 开山篇
    java基础07 多线程
  • 原文地址:https://www.cnblogs.com/yyxayz/p/4039663.html
Copyright © 2011-2022 走看看