以hidocoder上的一道裸題為例
如果我們不會manacher演算法。我們應該如何解決這個問題呢?
我們首先學習乙個叫中心擴充套件演算法的東西。
對於回文串我們可以選擇乙個中心,進行左右擴充套件,判斷左右兩邊字元是否相等。
因為字元存在奇數個或者偶數個,我們可以選擇每個字元或者兩個字元之間的空格進行擴充套件。所以總共可以產生2 * n - 1個中心。
實驗實現的**:
public string longestpalindrome(string s)空間複雜度:o(1)}return s.substring(start, end + 1);
}private int expandaroundcenter(string s, int left, int right)
return r - l - 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 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!解題報告 找兩個之間的最長回文串,只不過...