最長回文子串求解 馬拉車演算法學習

2022-06-26 11:33:13 字數 817 閱讀 9169

以hidocoder上的一道裸題為例

如果我們不會manacher演算法。我們應該如何解決這個問題呢?

我們首先學習乙個叫中心擴充套件演算法的東西。

對於回文串我們可以選擇乙個中心,進行左右擴充套件,判斷左右兩邊字元是否相等。

因為字元存在奇數個或者偶數個,我們可以選擇每個字元或者兩個字元之間的空格進行擴充套件。所以總共可以產生2 * n - 1個中心。

實驗實現的**:

public string longestpalindrome(string s) 

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

}private int expandaroundcenter(string s, int left, int right)

return r - l - 1;

}

空間複雜度:o(1)

時間複雜度:o(n^2)

顯然時間複雜度相對於空間複雜度,更高。

我們可以考慮利用空間來換時間。

manacher演算法

我們首先用它解決奇偶數問題

我們再兩個字元之間新增乙個分隔符,可以插入'#'

轉換後一定是奇數

len陣列的引入

回文半徑定義

len[x] - 1就是回文長度

關鍵在於對len陣列的求解

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

最長回文子串,即正反讀起來都一樣,例如 ababa manacher algorithm演算法利用了回文的重複特性,讓時間複雜度降為了o n 馬拉車演算法詳解 改造字串,在中心擴充套件法中,要求區分字串長度為奇數或偶數的情況,我們這裡對字串進行簡單的改造,讓字串變成奇數便於處理。例 ababad a...

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

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

最長回文串 馬拉車演算法

有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a l1 r1 b中選乙個可以為空的子串b l2 r2 滿足r1 l2,然後把它們拼起來 a l1 r1 b l2 r2 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!解題報告 找兩個之間的最長回文串,只不過...