LeetCode 516 最長回文子串行

2022-09-21 00:21:09 字數 1113 閱讀 5618

516. 最長回文子串行

給你乙個字串s,找出其中最長的回文子串行,並返回該序列的長度。

子串行定義為:不改變剩餘字元順序的情況下,刪除某些字元或者不刪除任何字元形成的乙個序列。

示例 1:

輸入:s = "bbbab"

輸出:4

解釋:乙個可能的最長回文子串行為 "bbbb" 。

示例 2:

輸入:s = "cbbd"

輸出:2

解釋:乙個可能的最長回文子串行為 "bb" 。

最長回文子串

最長公共子串行

本題屬於子串行的問題之一,問題的關鍵在於動態方程的定義,類似於最長回文子串的解法,我們dp 陣列的定義是:在子串 s[i..j] 中,最長回文子串行的長度為 dp[i][j]。

狀態轉移方程如下:

if (s[i] == s[j])

// 它倆一定在最長回文子串行中

dp[i][j] = dp[i + 1][j - 1] + 2;

else

// s[i+1..j] 和 s[i..j-1] 誰的回文子串行更長?

dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

本題需要注意的一點是,如何確定遍歷的方向?其實這個不難,我們只需要根據子結構來確定就好了,如根據dp[i+1][j-1]我們可以確定i一定是逆序遍歷的,而j一定是正序遍歷的。

class solution {

public int longestpalindromesubseq(string s) {

int n = s.length();

// dp[i][j]表示(i, j)子串的最長回文子串行

int dp = new int[n][n];

for(int i=0; i=0; i--){

for(int j = i+1; j關於子串行問題,有一篇文章寫的很好:

LeetCode 516 最長回文子串行

這題看了好久 本來以為和最長字串差不多用動態規劃設兩個列表來算但是沒什麼頭緒 後來去看了別人的解法 看了十幾分鐘才看懂 下面這種解法 1單位要單獨拿出來算 從2開始因為互文的子串行兩頭肯定是一樣的 如 aba acbca 假如能使 martix i j 等於從 s i 到 s j 所包含的最大子串行...

leetcode 516 最長回文子串行

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb 解題思路 狀態 f i j 表示 s 的第 i 個字元到第 j 個字元組成的子串...

leetcode516 最長回文子串行

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb f i j 表示 s 的第 i 個字元到第 j 個字元組成的子串中,最長的回文序...