原題連線:
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.讓字串成為回文串的...