字符串中的最长回文串

力扣第五题

暴力搜索+动态规划+马拉车

代码

暴力搜索 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)
}

猜你喜欢

转载自www.cnblogs.com/zuomeng/p/12738995.html