这道题我不理解,也不了解manacher算法。先这样吧,回头再看不浪费时间了。

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param A string字符串 
     * @return int整型
     */
    int getLongestPalindrome(string A) {
      int length = A.size();
      //  源字符串全部变为偶数个字符,加上头两位。最后有指向回文串最右一位的下一位,故组合出来的字符串实际个数为偶数个
      std::vector<int> mp(2 * length + 2);
      int max_len = 0;
      
      manacher(A, length, mp);
      
      for (int i = 0; i < 2 * length + 2; ++i) {
        //  为什么减一
        //  减一是否由于是最右的下一位
        //  减一是因为中间一位算多一位?
        max_len = std::max(max_len, mp[i] - 1);
      }
      
      return max_len;
    }
  private:
  void manacher(std::string &str, int length, std::vector<int> &mp) {
    std::string s = "";
    s += "$#";
    
    //  变成偶数?
    for (int i = 0; i < length; ++i) {
      s += str[i];
      s += '#';
    }
    
    //  最长回文子串最右一位的后一位
    int max_pos = 0;
    //  当前最长回文子串的中心点
    int idx = 0;
    
    for (int i = 0; i < s.size(); ++i) {
      //  max_pos - i 不用加一,因为max_pos指向最右的下一位
      //  max_pos <= i 则是刚开始的情况
      //  mp[i] 计算的是最长回文子串的一半长度,因为原字符串被扩大了一倍
      mp[i] = max_pos > i ? std::min(mp[2 * idx - i], max_pos - i) : 1;
      //  两边扫描
      while (s[i + mp[i]] == s[i - mp[i]]) {
        ++mp[i];
      }
      //  更新位置
      //  mp[i] 表示的长度包含i本身,所以max_pos指向最右字符的下一位
      if (i + mp[i] > max_pos) {
        max_pos = i + mp[i];
        idx = i;
      }
    }
  }
};