0516-最長迴文子序列
阿新 • • 發佈:2021-12-05
給你一個字串 s ,找出其中最長的迴文子序列,並返回該序列的長度。
子序列定義為:不改變剩餘字元順序的情況下,刪除某些字元或者不刪除任何字元形成的一個序列。
示例 1:
輸入:s = "bbbab"
輸出:4
解釋:一個可能的最長迴文子序列為 "bbbb" 。
示例 2:
輸入:s = "cbbd"
輸出:2
解釋:一個可能的最長迴文子序列為 "bb" 。
提示:
1 <= s.length <= 1000
s 僅由小寫英文字母組成
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/longest-palindromic-subsequence
參考:
python
# 0516.最長迴文子串 class Solution: def longestPalindromicSubSeq(self, s: str) -> int: """ 動態規劃,迴文串 1.dp - dp[i][j]:字串s在[i, j]範圍內最長的迴文子序列的長度為dp[i][j] 2.遞推 - s[i] == s[j], dp[i][j] = dp[i+1][j-1] + 2 - s[i] != s[j] , dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 3.初始化 - dp[i][i] = 1 4.遍歷順序 - 外層後向前 - 前到後 :param s: :return: """ dp = [[0] * len(s) for _ in range(len(s))] for i in range(len(s)): dp[i][i] = 1 for i in range(len(s)-1, -1, -1): for j in range(i+1, len(s)): 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][-1]
golang
package dynamicPrograming // 動態規劃 func longestPalindromicSubseq(s string) int { length := len(s) dp := make([][]int, length) // 初始化 for i:=0;i<length;i++ { for j:=0;j<length;j++ { if dp[i] == nil { dp[i] = make([]int, length) } if i==j { dp[i][j] = 1 } } } // 遍歷 for i:=length-1;i>=0;i-- { for j:=i+1;j<length;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][length-1] } func max(a,b int) int { if a < b {return b} return a }