给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: s = "aacecaaa"
输出: "aaacecaaa"
示例 2:
输入: s = "abcd"
输出: "dcbabcd"
题解
本题求出最长回文前缀即可,例如abbabbacd的最长回文前缀为abbabba。 采用字符串hash求出正序和逆序的hash值,如果hash值相等,则互为回文字符串,更新结果。
hash算法
代码
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
}