manacher算法,参考解题思路:https://leetcode.wang/leetCode-5-Longest-Palindromic-Substring.html
package main
//import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param A string字符串
* @return int整型
*/
func getLongestPalindrome( A string ) int {
// write code here
tmp:=preProcess(A)
n:=len(tmp)
P:=make([]int,n)
//一开始处于^,因此P[C]=0,C=0,R=0
C,R:=0,0
//遍历时#也遍历
for i:=1;i<n-1;i++{
i_mirror:=2*C-i
if R>i{
//i在R左侧,选择R范围内的有效值
P[i]=min(R-i,P[i_mirror])
}else{
//等于R的情况
P[i]=0
}
//中心扩展
for tmp[i+1+P[i]]==tmp[i-1-P[i]]{
//因为#的存在,此处仅+1即可表示回文串长度
P[i]++
}
//判断是否更新R
if i+P[i]>R{
C=i
R=i+P[i]
}
}
maxLen:=0
for i:=1;i<n-1;i++{
if P[i]>maxLen{
maxLen=P[i]
}
}
return maxLen
}
func preProcess(s string) string{
n:=len(s)
if n==0{
return "^$"
}
ret:="^"
for i:=0;i<n;i++{
ret+="#"+string(s[i])
}
ret+="#$"
return ret
}
func min(a,b int) int{
res:=a
if res>b{
res=b
}
return res
}

京公网安备 11010502036488号