516. 最长回文子序列

给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。不连续。可以假设 s 的最大长度为 1000
输入:
“bbbab”
输出:
4

  1. //二维dp,时空On^2
  2. func longestPalindromeSubseq(s string) int {
  3. n := len(s)
  4. dp := make([][]int, n+1)
  5. for i := range dp {
  6. dp[i] = make([]int, n+1)
  7. dp[i][i] = 1
  8. }
  9. for i := n-1; i >= 0; i-- { //倒序遍历
  10. for j := i+1; j < n; j++ {
  11. if s[i] == s[j] {
  12. dp[i][j] = dp[i+1][j-1] + 2
  13. } else {
  14. dp[i][j] = max(dp[i+1][j], dp[i][j-1])
  15. }
  16. }
  17. }
  18. return dp[0][n-1]
  19. }
  20. func max(x int, y int) int {
  21. if x > y {
  22. return x
  23. }
  24. return y
  25. }