遇见YY

导航

 

题目来源:https://leetcode-cn.com/problems/longest-palindromic-substring/submissions

思路:动态规划(参看官方解析)

关键点:

1:对于字符串长度大于2,状态转移方程:P(i,j)=P(i+1,j1) && (Si==Sj

2:边界条件:子串的长度为 1 或 2。对于长度为 1 的子串,它显然是个回文串;对于长度为 2 的子串,只要它的两个字母相同,它就是一个回文串。

1        
x 1      
x x 1    
x x x 1  
x x x x 1

 

3:遍历下三角即可以求出最大回文字符串

go代码:

package main

func longestPalindrome(s string) string {

    ans:=""
    max:=0
    n := len(s)
    dp := make([][]bool, n) //dp[i][j] 表示string [i,j]是回文字符串
    for i := 0; i < n; i++ {
        dp[i] = make([]bool, n)
    }


    //P(i,j) = P(i+1,j−1)^(Si ==S /j)
    for j:=0; j<n; j++  {
        for i:=0; i<=j; i++  {
            if j == i {
                dp[j][i] = true
            }else if j - i == 1 {
                if s[j] == s[i] {
                    dp[j][i] = true
                }
            }else {
                dp[j][i] = (s[j] == s[i]) && (dp[j-1][i+1])
            }
            if dp[j][i] &&  max <= (j-i){
                max = j-i
                ans = s[i:j+1]
            }
        }
    }
    return ans
}


func main() {
    println(longestPalindrome("a"))
}

 

 

 

posted on 2020-12-13 17:05  一骑红尘妃子笑!  阅读(116)  评论(0编辑  收藏  举报