自己寫的計算最長迴文字符串長度的程序,測試時間太長不滿足要求。
我的思路是遍歷字符串,計算以每個字符爲中心的迴文長度,複雜度爲O(n^2);
上網查閱找到一個manachor算法複雜度爲O(n),算法很難理解,花費不少的時間去解讀,這裏簡單記錄一下。
首先Manachor通過用“#”字符將原字符串隔開,以此消除長度爲奇偶的影響;
充分利用迴文串的特點,計算半徑的最小值(核心部分)。下圖爲示例
上圖中mx爲當前以pi位置爲中心的迴文串的右邊界,當計算p[i+1]時,利用對稱性,p[i+1]和p[i-1]對稱,已p[i+1]的半徑與p[i-1]一致;但是需要考慮mx的位置,即r(p[i+1]) = min{r(p[i-1]), mx - p[i+1]} (對稱部分,和越界部分)將1換成任意j都成立。
參考文獻鏈接:http://www.cnblogs.com/houkai/p/3371807.html