福哥答案2020-02-13:
假设字符串str是“abcde12344321”,在str后添加“edcba”即可变成回文串。需要添加5个字符。
解法:包含最后一个字符的manacher算法算出长度,然后str的总长度减去manacher长度,就是需要添加的字符个数。
代码用golang编写,代码如下:、
package main import "fmt" func main() { str := "abcde12344321" ret := ShortestEnd(str) fmt.Println(ret) } func ShortestEnd(s string) int { str := manacherString(s) strLen := len(str) pArr := make([]int, strLen) C := -1 R := -1 ret := 1 for i := 0; i < strLen; i++ { if R > i { pArr[i] = getMin(R-i, pArr[2*C-i]) } else { pArr[i] = 1 } for i+pArr[i] < strLen && i-pArr[i] >= 0 { if str[i+pArr[i]] == str[i-pArr[i]] { pArr[i]++ } else { break } } if i+pArr[i] > R { R = i + pArr[i] C = i } //修改 if R == strLen { ret = getMax(ret, pArr[i]) break } } //修改 return strLen/2 - ret + 1 } func manacherString(s string) string { ret := "#" sLen := len(s) for i := 0; i < sLen; i++ { ret += fmt.Sprintf("%c#", s[i]) } return ret } func getMax(a int, b int) int { if a > b { return a } else { return b } } func getMin(a int, b int) int { if a < b { return a } else { return b } }
执行结果如下: