LeetCode 動態規劃 5 最長回文子串

2021-10-10 06:53:38 字數 1668 閱讀 7019

原題連線:

class

solution

int len = s.

length()

;if(len <=1)

if((len>

1&& len <=3)

&&(s.

charat(0

)==s.

charat

(len-1)

))// 狀態陣列定義 dp[游標位置i][j] = "ij包含的部分是否是回文字串"

boolean

dp =

newboolean

[len]

[len]

;for

(int i=

0; i)// 對於狀態轉移方程表示式, 當長度:

// 1.大前提: charat(i) == charat(j), 如果不相等,那麼它一定不是回文字串

// 2.狀態轉移:charat(i) == charat(j)時,只需要判斷 [i+1]和[j-1], 同時滿足時就是回文,那麼就有:dp[i][j]=dp[i+1][j-1] && (charat(i)==charat(j))

// 3.迴圈內的特殊情況:i、j長度是3以下的,且charat(i) == charat(j)直接可以判斷 dp[i][j] = true

// 迴圈區間要注意,第一層是 j 到len,第二層是i到j, 相當於在字串s上有乙個變長的遊標尺在遍歷,首先從第0位開始,尺子長度從0到len-1開始變化;緊接著尺子長度又變為0,從第1個位置開始遍歷遊走

int maxlen =1;

int beginindex =0;

for(

int j=

1; j)else

else}if

(dp[i]

[j]&&

(j-i+

1> maxlen))}

} system.out.

println

(beginindex)

; system.out.

println

(maxlen)

;return s.

substring

(beginindex, beginindex + maxlen);}

/** 解法2:中心擴散法,不通用 */

public string longestpalindrome_bak

(string s)

else

if(len <2)

// 中心擴散法,設想有乙個游標在s中遍歷。只需要從這個游標向左右同步擴散同時判斷字串是否相等即可。

// 這裡包含2種情況,1:游標在字元中間,取得的字串是偶數;2:游標剛好是某個字元,此時返回並且要判斷的字串是奇數。建立乙個方法同時判斷奇偶情況,返回的取較大的串

string res ="";

for(

int i=

0; i)return res;

}public string judgeandreturnsub

(string s,

int i,

int j)

else

}return s.

substring

(left+

1, right);}

}

LeetCode5 最長回文子串 動態規劃

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 為什麼說這道題可以用動態規劃呢?這道題是求最長回文子串,是求極值,那麼這就可以用動態規劃解題。想到動規,就...

LeetCode 5 最長回文子串 動態規劃)

1.動態規劃 時間複雜度o n 2 空間複雜度o n 2 大體思路就是 如果 aba 是回文的 那麼 aabaa 也一定是回文的 因為就是在兩邊加上了相同的 所以從最小的 a aa aba 這種開始 逐漸擴張 找到最大的乙個 class solution def longestpalindrome ...

LeetCode 5 最長回文子串(動態規劃)

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb leetcode 1216.驗證回文字串 iii dp leetcode 1312.讓字串成為回文串的...