LeetCode 516. 最长回文子序列

题目描述

516. 最长回文子序列

image-20250510222956499

思路分析

这是一个典型的区间动态规划问题,我们要在字符串中找到最长的回文子序列的长度。

我们定义状态:dp[i][j] 表示 s[i...j](包含 i 和 j)这个区间内的最长回文子序列的长度

目标是求:dp[0][n-1]

image-20250510223416363

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func longestPalindromeSubseq(s string) int {
	n := len(s)
	// 定义 dp[i][j] 表示从 i 到 j 的最长回文子序列长度
	dp := make([][]int, n)
	for i := 0; i < n; i++ {
		dp[i] = make([]int, n)
		dp[i][i] = 1 // 单个字符是回文
	}

	// 从下往上遍历,保证 i < j 的状态都被计算
	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+1][j], dp[i][j-1])
			}
		}
	}
	return dp[0][n-1]
}
  • 时间复杂度:O(n²),共需填充 n × n 个状态。
  • 空间复杂度:O(n²),使用了二维 dp 数组。

➡️ 点击查看 Java 题解

1
write your code here

相似题目

image-20250510223657747

本文作者:
本文链接: https://hgnulb.github.io/blog/2025/66793237
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!