最长回文

回文:翻转后和原字符串相同

解法一 O(n^2):翻转,和原始字符串求最长子串,并验证是否为回文

解法二 O(n^2):遍历字符串,每次遍历以当前元素(以及连同后一个元素)为中心向外扩展,找到最长回文

// 在字符串首尾,及各字符间各插入一个字符,让原来可能的偶回文转为回文
// 本质上还是中心扩散法,只不过它使用了类似 KMP 算法的技巧,充分挖掘了已经进行回文判定的子串的特点,在遍历的过程中,记录了已经遍历过的子串的信息,也是典型的以空间换时间思想的体现
// 除了循环变量 i 以外,还记录两个变量 maxRight 和 center
  • i >= maxRight,此时只能够根据"中心扩散法"一个一个扫描
  • i < maxRight,p[mirror] 的数值比较小,不超过 maxRight - i, p[i] = p[mirror]
  • i < maxRight,p[mirror] 的数值恰好等于 maxRight - i, 先 p[i] = p[mirror],然后继续"中心扩散法",继续增加 maxRight
  • i < maxRight,p[mirror] 的数值大于 maxRight - i,p[i] = maxRight - i