leetcode困难题 214. 最短回文串

186 阅读1分钟

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: s = "aacecaaa"
输出: "aaacecaaa"

示例 2:

输入: s = "abcd"
输出: "dcbabcd"

题解

本题求出最长回文前缀即可,例如abbabbacd的最长回文前缀为abbabba。 采用字符串hash求出正序和逆序的hash值,如果hash值相等,则互为回文字符串,更新结果。

hash算法

image.png

代码

func shortestPalindrome(s string) string {
   n := len(s)
   base, mod := 131, 1000000007
   left, right, mul := 0, 0, 1
   best := -1
   for i := 0; i < n; i++ {
      left = (left * base + int(s[i] - '0')) % mod   //左hash
      right = (right + mul * int(s[i] - '0')) % mod  //右hash
      if left == right {
         best = i                                   //最长回文前缀长度
      }
      mul = mul * base % mod
   }
   add := ""
   if best != n - 1 {
      add = s[best + 1:]
   }
   b := []byte(add)
   for i := 0; i < len(b) / 2; i++ {
      b[i], b[len(b) - 1 -i] = b[len(b) - 1 -i], b[i]
   }
   return string(b) + s
}