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 }