劍指leetcode 最長回文子串

2021-10-06 21:29:17 字數 2554 閱讀 4803

題目描述:給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: 「babad」

輸出: 「bab」

注意: 「aba」 也是乙個有效答案。

示例 2:

輸入: 「cbbd」

輸出: 「bb」

本部落格參考於最長回文子串題解

方法一:

根據回文串的性質,依次的列舉出所有長度大於等於2的子字串,然後判斷其是否滿足回文串的性質,每一迴圈都有機會更新回文子字串的最長長度maxlen,同時記錄回文字串的開始下標begin,等所有情況列舉完成,然後擷取最長回文子串從begin開始,擷取長度為maxlen。

public class solution 

int maxlen = 1;

int begin = 0;

// s.charat(i) 每次都會檢查陣列下標越界,因此先轉換成字元陣列

char chararray = s.tochararray();

// 列舉所有長度大於 1 的子串 chararray[i..j]

for (int i = 0; i < len - 1; i++) }}

return s.substring(begin, begin + maxlen);

}/**

* 驗證子串 s[left..right] 是否為回文串

*/private boolean validpalindromic(char chararray, int left, int right)

left++;

right--;

}return true;}}

方法二:

定義狀態

dp[i][j]表示子串s【i,,j】(都是閉區間)是否是回文子串。dp[i][j]的值都是boolean型別

思考狀態轉移方程

dp[i][j]=(s[i]==s[j])&&dp[i+1][j-1]

dp[i][j]代表的是s【i,,j】是否是回文子串,dp陣列中存放的是boolean,true表示是回文子串。

dp[i][j]的值取決於(s[i]==s[j])和dp[i+1][j-1]

因此,在 s[i] == s[j] 成立和 j - i < 3 的前提下,直接可以下結論,dp[i][j] = true,否則才執行狀態轉移。

初始化

初始化,單個字元時一定是回文子串,所以對角線初始化都為true,dp[i][j]=true

考慮輸出

只要一得到 dp[i][j] = true,就記錄子串的長度和起始位置,記錄此時的回文子串的「起始位置」和「回文長度」即可。

public class solution 

int maxlen = 1;

int begin = 0;

// dp[i][j] 表示 s[i, j] 是否是回文串

boolean dp = new boolean[len][len];

char chararray = s.tochararray();

for (int i = 0; i < len; i++)

for (int j = 1; j < len; j++) else else

}// 只要 dp[i][j] == true 成立,就表示子串 s[i..j] 是回文,此時記錄回文長度和起始位置

if (dp[i][j] && j - i + 1 > maxlen) }}

return s.substring(begin, begin + maxlen);}}

方法三:

使用雙指標,從中心某處擴散,如果i,j指標指向的元素相同,則擴大雙指標的範圍繼續比較下去,否則做相應的處理

所有就有幾個問題需要解決

中心指的是什麼?

中心指的是從哪乙個位置開始向兩邊擴散

回文串可以為奇數個元素也可以是偶數個元素,有什麼區別嗎?

當回文串是偶數個元素時,中心就是間隙,不是具體的元素

當回文串是奇數個元素時,中心就是中間的那個元素

return s.substring(i+1,j);//最後返回的時候,因為i出的元素不等於j處的元素,所以從i+1開始到j-1結束才是回文字串

}}

最長回文子串 LeetCode 五 最長回文子串

題目 最長回文子串 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。題目解析 回文?當回文串長度為奇數時,比如 北京計程車租出京北 當回文串長度為偶數的時候,比如 1221 以上兩種情況有乙個共同的特點就是有乙個中心,那在 中如何表示中心呢?class solution ...

leetcode 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 中心拓展法 由乙個中心點開始向兩邊拓展,檢測邊界,判斷兩個值是否相等,相等則繼續拓展下去,檢測邊界。1....

最長回文子串(LeetCode)

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s type s str r...