前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LC *516. 最长回文子序列(DP)

LC *516. 最长回文子序列(DP)

作者头像
SakuraTears
发布2022-01-13 15:12:25
3350
发布2022-01-13 15:12:25
举报

题目

0.png
0.png

思路

二维DP

首先确定dp[i][j]含义:字符串s[i...j]的最长回文子序列。

转移方程:如果知道dp[i+i][j-1]能不能知道dp[i][j]

1.png
1.png

图中dp[i+1][j-1] = 1s[i] == s[j],由图可以看出dp[i][j] = 3:aca。 那么可以得出当s[i] == s[j]时,dp[i][j] = dp[i+1][j-1]。 当s[i] != s[j]时,那么i或j其中一个就不在s[i...j]的最长回文子串中,分别求一下dp[i+1][j] dp[i][j-1] 大小就能知道谁不在了。

i == j的地方dp肯定为1,i > j的地方不合理所以遍历只需要遍历二维数组的上半部分。

2.png
2.png
代码语言:javascript
复制
func longestPalindromeSubseq(s string) int {
    n := len(s)
    dp := make([][]int, n)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    for i := 0; i < n; i++ {
        dp[i][i] = 1
    }
    for i := n - 1; i >= 0; i-- {
        for j := i + 1; j < n; j++ {
            if s[i] == s[j] {
                dp[i][j] = dp[i+1][j-1] + 2
            } else {
                dp[i][j] = max(dp[i][j-1], dp[i+1][j])
            }
        }
    }
    return dp[0][n-1]
}

func max(i, j int) int {
    if i > j {
        return i
    }
    return j
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年01月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档