516.longest-palindromic-subsequence.go 689 B

123456789101112131415161718192021222324252627282930313233
  1. func longestPalindromeSubseq(s string) int {
  2. n := len(s)
  3. if n < 2 {
  4. return n
  5. }
  6. runes := []rune(s)
  7. dp := make([][]int, n)
  8. for i := range dp {
  9. dp[i] = make([]int, n)
  10. dp[i][i] = 1
  11. }
  12. // dp[i][j], len of LPS of s[i:j+1]
  13. // dp[i][j] = max(dp[i][j], dp[i+1][j-1]+2), if s[i] == s[j]
  14. // dp[i][j] = max(dp[i+1][j], dp[i][j-1]), if s[i] != s[j]
  15. for l := 1; l < n; l++ {
  16. for i := 0; i+l < n; i++ {
  17. if runes[i] == runes[i+l] {
  18. dp[i][i+l] = maxInt(dp[i][i+l], dp[i+1][i+l-1]+2)
  19. // If j-1 < i+1, dp[i][j] = 0
  20. } else {
  21. dp[i][i+l] = maxInt(dp[i+1][i+l], dp[i][i+l-1])
  22. }
  23. }
  24. }
  25. return dp[0][n-1]
  26. }
  27. func maxInt(x, y int) int {
  28. if x < y {
  29. return y
  30. }
  31. return x
  32. }