力扣演算法篇 最長回文子串

2021-10-22 20:42:34 字數 1295 閱讀 1229

求解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...