写点什么

[Day10]-[动态规划] 最长回文子序列

作者:方勇(gopher)
  • 2022 年 4 月 09 日
  • 本文字数:643 字

    阅读完需:约 2 分钟

[Day10]-[动态规划]最长回文子序列

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)}
复制代码


用户头像

Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入

我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!

评论

发布
暂无评论
[Day10]-[动态规划]最长回文子序列_LeetCode_方勇(gopher)_InfoQ写作平台