求解len[i]:
設(l,r)表示當前最靠右的子回文串的邊界:
(1)若i>r,則該子回文串對len[i]的計算無法起到任何幫助,直接呼叫樸素演算法計算len[i]
(2)若i<=r,則說明元素s[i]處於該子回文串內,由於回文串的特性,我們可以在該子回文串的左側找到乙個與s[i]對稱的元素s[j].那麼我們可以考慮將len[j]賦值給len[i];但還需要考慮以下兩種情況:
①若以s[j]為中心的回文子串長度過長,超出了(l,r)範圍時,超出的部分就不與s[i]對稱,這部分需要截掉,故式子變為:len[i] = min(len[l+r-i],r-i);其中,len[l+r-i]就是len[j]
②以s[i]為中心的回文子串最大長度可能更大,超出r的範圍,則此時需要繼續採用樸素演算法計算,初值是之前計算的長度;
class
solution
int newlen =
2*len+1;
//加上分隔符後序列長度變為2*len+1
for(
int i =
0;i < newlen; i=i+2)
/*使用len陣列來輔助求回文子串在原字串中的長度*/
//len陣列
vector<
int> len;
len.
reserve
(newlen)
;//最長回文子串的半徑
int maxlength =-1
;//左邊界 l
int l =0;
//右邊界
int r =-1
;//最長回文子串的中心點
int k1 =0;
for(
int i =
0;i)//減1變為所定義的半徑
k--;//賦值給len[i]
len[i]
= k;
// 如果超出邊界,則更新l和r
if(i+k>r)
//更新最長回文子串的半徑和回文子串的中心點
if(maxlength
//取出回文串
string palindrome;
int j =0;
for(
int x=k1-len[k1]
;x<= k1+len[k1]
;x++)}
return palindrome;}}
;
力扣 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。我的第一想法是暴力,然後才是中心擴充套件法 雖然知道應該用動態規劃,但是實現不出來 public string longestpalindr...
最長回文子串 力扣
5種解法 1.最長公共子串 2.暴力法 3.動態規劃 4.中心擴充套件法 5.manacher法 以下記錄大佬題解 演算法 什麼叫回文串?如果乙個字串正著讀和反著讀是一樣的,那它就是回文串。中心擴充套件演算法 我們觀察到回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n 1 個這樣...
力扣 最長回文子串 C
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。輸入 cbbd 輸出 bb include using namespace std define max a,b a b a b define min...