題目:給定乙個字串s,找出s中的最長回文子串;
暴力法,dp法, 中心擴充套件法,manacher演算法
解法一:暴力法
遍歷字串s的每乙個子串,去判斷這個子串是不是回文,是回文的話看看長度是不是比最大的長度maxlength大。遍歷每乙個子串的方法要o(n^2),判斷每乙個子串是不是回文的時間複雜度是o(n),所以暴利方法的總時間複雜度是o(n^3)。
1public
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;
1public
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,這樣長度為偶數。
1public
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)
詳細規則可參考另一篇部落格
1public
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...