516.最长回文子序列

68 阅读1分钟

题目:
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
算法:
方法一:动态规划
dp[i][j]表示从字符串s元素索引取值范围为[i,j]时,的最长会问子序列长度。 dp[i][j] = dp[i + 1][j - 1] + 2, s[i]==[j]
= max(dp[i + 1][j], dp[i][j - 1]), s[i] != s[j]

func longestPalindromeSubseq(s string) int {
	n := len(s)
	dp := make([][]int, n)
	for i := range dp {
		dp[i] = make([]int, n)
		dp[i][i] = 1
	}
	for i := n - 1; i >= 0; i -- {
		for j := i + 1; j < n; j ++ {
                        // i = n - 1, j=n, 不会进入这里
			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]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}