美文网首页
Longest Palindromic Subsequence

Longest Palindromic Subsequence

作者: fjxCode | 来源:发表于2018-09-22 15:38 被阅读0次

    Longest Palindromic Subsequence

    题目描述

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
    
    Example 1:
    Input:
    
    "bbbab"
    Output:
    4
    One possible longest palindromic subsequence is "bbbb".
    Example 2:
    Input:
    
    "cbbd"
    Output:
    2
    One possible longest palindromic subsequence is "bb".
    

    思路:

    • 动态规划,子串长i,起始索引为j的字串。最大子序列问题,动态规划串长和起始索引。
    • 由于是找序列,动规结果直接就是“子串的最大回文串长度”。
    • 对于dp[i][j],两边相等用则为2+dp[i-2][j+1],否则取dp[i-1][j-1]和dp[i-1][j+1]的最大值。解释:两边成对可以用去掉两边的结果计算。如果两边不成对,无论中间为奇数或偶数,最多只能“补充”一个字符。所以在补充一个字符的结果中选最大的。
    • 填充顺序,i从小大到填,逐行填充第i行。
    • 最终结果dp[n][0]

    解:

    package main
    
    import "fmt"
    
    func longestPalindromeSubseq(s string) int {
        sSlice := []rune(s)
        dp := make([][]int,len(sSlice)+1)
        for idx,_ := range dp{
            dp[idx] = make([]int,len(sSlice))
        }
        for i:= 0;i< len(sSlice);i++{
            dp[1][i] = 1
        }
    
        for i := 2; i<len(sSlice)+1;i++  {
            for j := 0; j<(len(sSlice)-i+1);j++  {
                if sSlice[j]== sSlice[i+j-1] {
                    dp[i][j] = dp[i-2][j+1]+2
                }else {
                    switch dp[i-1][j] > dp[i-1][j+1] {
                    case true:
                        dp[i][j] = dp[i-1][j]
                    case false:
                        dp[i][j] = dp[i-1][j+1]
                    }
                }
            }
        }
        fmt.Println(dp)
        return dp[len(sSlice)][0]
    }
    
    func main()  {
        s := "bbbab"
        res := longestPalindromeSubseq(s)
        fmt.Print(res)
    }
    

    相关文章

      网友评论

          本文标题:Longest Palindromic Subsequence

          本文链接:https://www.haomeiwen.com/subject/nhkxoftx.html