题目:
给你一个字符串 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
}