馬拉車(求最長回文字串)

2021-10-05 10:31:06 字數 816 閱讀 3332

參考: 

時間複雜度  o(

要分奇數子字串與偶數子字串

時間複雜度  o(

string findlongest(string s)

}return s.substr (start, end-start+1);

}int expand(string s, int left,int right)

return r-l-1;

}

不用分奇數子字串與偶數子字串

時間複雜度  o(

//字串的初始化,每個字元的前後加#,在最終字串前加&用來定界

string expand(string s)

return str;

}

len陣列 len[i] 表示在str(擴充套件的字串)中,以 i 為中心的最長回文半徑,所對應的原字串中最長回文串的長度為len[i]-1

idd 之前最右端的下標最大的回文子串

max  = idd + len[idd] 

2 * idd - i 為i 關於 idd 的對稱點

//manacher演算法的實現

string manacher(string s) else

while(str[i - len[i]] == str[i + len[i]])

if(max < i + len[i])

if(len[i] - 1 > maxlen)

} return s.substr(start, maxlen);

}

最長回文字串 馬拉車演算法

很簡單的例題,就比如hdu3068那個,模版題。首先我們可以考慮暴力,然後可以列舉中心,當你列舉中心的時候,先是1,再是2,如果2不行,那就可以退出了,因為以該點為中心的字串不能繼續拓展了。我們應該開始列舉下乙個中心點了。然後我們考慮優化,馬拉車演算法的核心就是利用了前面計算的資訊,從而高效的得出最...

最長回文字串(馬拉車演算法)

演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個 演算法,manacher 演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp 演算法有很多共通支出,所以...

最長回文串(馬拉車演算法)

最長回文子串 manacher演算法 馬拉車演算法 馬拉車演算法需要計算以每個字元為中心的回文串半徑。並記錄最右邊界 馬拉車演算法基於這樣乙個事實,從回文串的中心到兩邊是對稱的,意味著以兩邊對稱的字元為中心的回文串半徑相等 在不超過最右邊界的情況下,如果超出就需要擴充套件搜尋 public stri...