[Day10]-[动态规划] 最长回文子序列
作者:方勇(gopher)
- 2022 年 4 月 09 日
本文字数:643 字
阅读完需:约 2 分钟
![[Day10]-[动态规划]最长回文子序列](https://static001.geekbang.org/infoq/1d/1d1c9dd88e654687cf12eb48cdbb6ec3.png)
516. 最长回文子序列
难度中等 767 收藏分享切换为英文接收动态反馈
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = "bbbab"输出:4解释:一个可能的最长回文子序列为 "bbbb" 。
复制代码
示例 2:
输入:s = "cbbd"输出:2解释:一个可能的最长回文子序列为 "bb" 。复制代码
题解
func longestPalindromeSubseq(s string) int { var solution func(str string) int // 解决方案 var max func(x, y int) int // 取最大值 max = func(x, y int) int { if x > y { return x } return y } solution = func(str string) int { length := len(str) // 字符串长度 dp := make([][]int, length) // dpTable for i := 0; i < length; i++ { // 准备基础数据 对角线都是1 dp[i] = make([]int, length) dp[i][i] = 1 } // 倒序遍历(从下到上,从左到右) 从最下方 倒数第二行 最后一列开始填充 for i := length - 2; i >= 0; i-- { for j := i + 1; j < length; j++ { if str[i] == str[j] { // 如果相等 则回文数+2 dp[i][j] = dp[i+1][j-1] + 2 } else { // 如果不相等则取前一个元素或后一个元素的最大回文数 dp[i][j] = max(dp[i+1][j], dp[i][j-1]) } } }
return dp[0][length-1] // 终止条件就是整个字符的最大回文数 }
return solution(s)}复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!










评论