力扣第五题
暴力搜索+动态规划+马拉车
代码
暴力搜索 O(N^3)
func longestPalindrome(s string) string {
if len(s)==0{
return ""
}
var start,end,res=0,1,1
for i:=0;i<len(s);i++{
for j:=len(s)-1;j>i;j--{
if s[i]==s[j]{
var ok = true
for p1,p2:=i+1,j-1;p1<p2;p1,p2=p1+1,p2-1{
if s[p1]!=s[p2]{
ok=false
break
}
}
if ok && res<j-i+1 {
res=j-i+1
start,end=i,j+1
}
}
}
}
return s[start:end]
}
动态规划 O(N^2)
a[i][j]代表以第i个字符结尾,长度为j的字符串是回文串,即s[i-j+1:i+1)是回文串
func longestPalindrome(s string) string {
s="*"+s+"#"
a:=make([][]int,len(s))
if len(s)==2{
return ""
}
for i:=0;i<len(s);i++{
a[i]=make([]int,len(s))
}
var res,index =1,1
for i:=1;i<len(a)-1;i++{
a[i][0],a[i][1]=1,1
for j:=1;j<i;j++{
if s[i]==s[j]{
if a[i-1][i-j-1]==1{
a[i][i-j+1]=1
if i-j+1>res{
res,index=i-j+1,j
}
}
}
}
}
return s[index:index+res]
}
func getMax(a,b int)int{
if a>b{
return a
}
return b
}
Manacher(马拉车) 算法 O(N)
func longestPalindrome(s string) string {
strBuf:=make([]byte,1)
result:=make([]byte,0)
strBuf[0]='#'
for i:=0;i<len(s);i++{
strBuf=append(strBuf,s[i],'#')
}
var res,start int
// 获取要求字符串的长度和位置
for i:=0;i<len(strBuf);i++{
var count = 1
for j:=1;i-j>=0&&i+j<len(strBuf);j++{
if strBuf[i-j]==strBuf[i+j]{
if count<j*2+1{
count=j*2+1
}
}else{
break
}
}
if res<count{
res=count
start=i-count/2
}
}
// 获取要求的字符串
for i:=start;i<start+res;i++{
if strBuf[i]!='#'{
result=append(result,strBuf[i])
}
}
return string(result)
}