最長回文字串的三種解法

2021-09-28 21:01:56 字數 1400 閱讀 6996

題目描述:

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

示例 1:

輸入: "babad"

輸出: "bab"

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

示例 2:

輸入: "cbbd"

輸出: "bb"

想看**的這裡^_^

method one:暴力演算法

解析:暴力演算法就是字串的每乙個可能的字串進行判斷;

時間複雜度 o(n^3) ; 空間複雜度 o(1);

method two:中心擴充套件方法

回文子串,就是從左往右讀和從右往左讀是相同的,那麼這樣的字串有哪幾種型別呢?

答案是兩種,第一種bab型,第二張baab型式,而這兩種回文串的不同之處就是他們的中心,a和aa型;

接下來我們不難知道,如果以a或aa向兩邊進行擴充套件,如果其擴充套件後仍然是回文子串,那麼必然有left-1 == right+1

就如bab(以a為中心進行擴充套件就有左b等於右b) cbabc(以bab為中心擴充套件左c等於右c);這就是中心擴充套件法。

所以我們只需要找出每乙個的中心進行擴充套件,向外擴充套件並求出最長子串。

時間按複雜度:o(n^2)

空間複雜度:o(1)

method three:動態規劃法

什麼是動態規劃?那就是通過填表尋找規律。

在本題中,我們需要找到最長的回文子串,那麼我們就需要知道它的長度和它的首元素,因此我們必須知道他們的區間;這就引出了我們的動態規劃。

我們以i為最後乙個元素,j為第乙個元素,那麼[i,j]就是我們需要查詢的空間;那麼我們可以這樣做,做乙個二維陣列,用二維陣列的行和列分別來代表行和列,在這個二位陣列裡面進行填表找規律;如下圖

紅色部分:j不能訪問到;  

我們可以發現如果乙個子字串是回文的,那麼他有以下條件

1:s[i] == s[j]  (s為母字串)

2:i-j < 1 || arr[i-1][j+1] == true

時間按複雜度:o(n^2)

空間複雜度:o(n^2)

所以使用以上兩個條件就可以完成我們的演算法了。

leetcode 5 最長回文子串 三種解法

dp i,j true quad i j s i s j true false quad,j i 2 dp i 1,j 1 s i s j quad j i 2 end right.dp i,j tru e,i js i s j true fal se,j i 2d p i 1,j 1 s i s ...

最長回文字串的幾種解法

示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 1 暴力解法public class 最長回文字串 int maxlen 1 int begin 0 轉換成字元陣列 char chararray s.tochararray 列舉所有長度...

回文數字的三種解法

要求 在不使用額外空間的前提下,判斷乙個數字是否是回文數字,例如12321是回文,1234521不是回文 回文數字的最大特徵就是最後乙個數字和第乙個數字相等,由此可以得出兩個特徵 1 回文數字反轉之後,跟反轉之前的值相等 2 回文數字首尾是對稱的 基於上述兩個特徵,可以衍生下面三個演算法 解法一 將...