Leetcode5 最長回文子串

2022-07-20 02:27:10 字數 2671 閱讀 9270

題目:給定乙個字串s,找出s中的最長回文子串;

暴力法,dp法, 中心擴充套件法,manacher演算法

解法一:暴力法

遍歷字串s的每乙個子串,去判斷這個子串是不是回文,是回文的話看看長度是不是比最大的長度maxlength大。遍歷每乙個子串的方法要o(n^2),判斷每乙個子串是不是回文的時間複雜度是o(n),所以暴利方法的總時間複雜度是o(n^3)。

1

public

static

string findlongestpalindrome(string s)

14//

若index1=index2,表示串是類似於abcba這種型別;若大於,則是abccba這種型別

15if(index1 >= index2 && j - i >maxlength)19}

2021}22

if(maxlength > 0)

23return s.substring(start, start +maxlength);

24return

null;25

26 }

解法二: 動態規劃

回文字串的子串也是回文,比如p[i,j](表示以i開始以j結束的子串)是回文字串,那麼p[i+1,j-1]也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o(n^2),演算法複雜度也是o(n^2)。

首先定義狀態方程和轉移方程:

p[i,j]=false:表示子串[i,j]不是回文串。p[i,j]=true:表示子串[i,j]是回文串。

p[i,i]=true:當且僅當p[i+1,j-1] = true && (s[i]==s[j])

否則p[i,j] =false;

1

public

static

string findlongestpalindrome1(string s)14}

15//

使用上述結果可以dp出子串長度為3~len -1的子串

16for(int strlen = 3; strlen < len; strlen ++)24}

25}26if(maxlength > 0)

27return s.substring(start, start +maxlength);

28return

null

;29 }

解法三:中心擴充套件法

中心擴充套件就是把給定的字串的每乙個字母當做中心,向兩邊擴充套件,這樣來找最長的子回文串。演算法複雜度為o(n^2)。

但是要考慮兩種情況:

1、像aba,這樣長度為奇數。

2、想abba,這樣長度為偶數。

1

public

static

string findlongestpalindrome2(string s)

14 j --;

15 k ++;16}

17}18//

類似於abba這種情況,以i,i+1為中心向兩邊擴充套件

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

27 j --;

28 k ++;29}

30}31if(maxlength > 0)

32return s.substring(start, start +maxlength);

33return

null

;34 }

解法四:manacher演算法

manacher法只能解決例如aba這樣長度為奇數的回文串,對於abba這樣的不能解決,於是就在裡面新增特殊字元。我是新增了「#」,使abba變為a#b#b#a。這個演算法就是利用已有回文串的對稱性來計算的,具體演算法複雜度為o(n)

詳細規則可參考另一篇部落格

1

public

static

string findlongestpalindrome3(string s)

17else

//否則,需要根據i點一點一點的計算

1827 res[i] = r -i + k - 1;

28if(res[i] + i >r)

2933}34

35 maxc = res[maxc] > res[i] ? maxc : i; //

maxc儲存的是回文半徑最大的那個點的位置36}

37 string substr = str.substring(maxc - res[maxc], maxc + res[maxc] + 1);

38 stringbuffer sb = new

stringbuffer();

39for(int i = 0; i < substr.length(); i++)

4044

return

sb.tostring();45}

46public

static string dealwiths(string s) //

將原字串進行處理

4755

return

sb.tostring();

56 }

LeetCode5最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...

LeetCode 5 最長回文子串

問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...

leetcode5 最長回文子串

遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...