[Day10]-[动态规划] 最长回文子序列
作者:方勇(gopher)
- 2022 年 4 月 09 日
本文字数:643 字
阅读完需:约 2 分钟
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,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论