LeetCode5 求回文子串算法

  串相关算法打比赛那段时间就没怎么接触。。。408的kmp算法更是背下来的。

  串常见算法有KMP算法,后缀树组,ac自动机,字典树等等。。

 

  本题是最快速地求出一个字符串当中的最长回文子串。

 

  https://www.cnblogs.com/mini-coconut/p/9074315.html这篇博客讲的最清楚了感觉,马拉车算法,

有点类似每个点向左右拓延的n方算法。

 

直接附上这位老哥的代码叭

马拉车算法

string longestPalindrome(string s)
 {
    string manaStr = "$#";
    for (int i=0;i<s.size();i++) //首先构造出新的字符串  {
      manaStr += s[i];
      manaStr += '#';
    }
    vector<int> rd(manaStr.size(), 0);//用一个辅助数组来记录最大的回文串长度,注意这里记录的是新串的长度,原串的长度要减去1
    int pos = 0, mx = 0;
    int start = 0, maxLen = 0;
    for (int i = 1; i < manaStr.size(); i++) 
    {
      rd[i] = i < mx ? min(rd[2 * pos - i], mx - i) : 1;
      while (i+rd[i]<manaStr.size() && i-rd[i]>0 && manaStr[i + rd[i]] == manaStr[i - rd[i]])//这里要注意数组越界的判断,源代码没有注意,release下没有报错
          rd[i]++;
      if (i + rd[i] > mx) //如果新计算的最右侧端点大于mx,则更新pos和mx
      {
        pos = i;
        mx = i + rd[i];
      }
      if (rd[i] - 1 > maxLen)    {
        start = (i - rd[i]) / 2;
        maxLen = rd[i] - 1;
      }
    }
    return s.substr(start, maxLen);
  }

 

posted @ 2021-04-14 16:44  TheDa  阅读(62)  评论(0编辑  收藏  举报