Manacher解決最長回文子串

2021-07-13 02:54:58 字數 986 閱讀 2220

給定乙個字串,求解該字串的最長回文子串

以字串中的每個字元為中心,列舉其最長的回文子串,注意奇數和偶數長度的子串

int longpalindrome(char*str)

return maxlen;

}

該演算法為dp演算法,我們可以儲存上面中心擴充套件的結果來計算後面的點,如下圖

我們用f[i]表示以i為中心的最長的回文子串長度

如果我們從左到右得到位於center的結果f[center]了,那麼現在計算以i為中心的f[i]

其中rb為以center為中心的最大右邊界,left是i以center為對稱的點

1. 當i + j < rb時,我們根據對稱性,我們可以直接得到 f[ i ] = f[ left ]

2. 當i + j >= rb時,我們直接從rb位置開始擴充套件以i為中心的回文子串,同解法一方法一樣擴充套件到最長位置

對於奇數和偶數的情況,我們在每兩個字元之間插入乙個特殊字元來進行處理,就可以統一奇數和偶數的處理了

如abababa變為#a#b#a#b#a#b#a#,在我們下面的演算法中,直接用f[i]表示擴充套件時的j值,對於以i為中心的原始最長回文子串長度即為f[i]

int manacher(char*str)

int helplen = strlen(helpstr);

int f[helplen];

int center = 1;

int rb = 2;

f[0] = 0;

f[1] = 1;

for(int i = 2; i < helplen; i ++)

maxlen = maxlen > f[i] ? maxlen : f[i];

}return maxlen;

}

Manacher 最長回文子串

最長回文子串問題 給定乙個字串,求它的最長回文子串長度。如果乙個字串正著讀和反著讀是一樣的,那它就是回文串。下面是一些回文串的例項 12321 a aba abba aaaa tattarrattat 牛津英語詞典中最長的回文單詞 對於最長回文子串問題,最簡單粗暴的辦法是 找到字串的所有子串,遍歷每...

Manacher 最長回文子串

caioj任意門 hz2016評測傳送門 可以的話來一下hz2016評測吧,有的題caioj沒有的我也可以給到資料嘛。include include include include include include include include define maxchar 100000 defin...

最長回文子串 manacher演算法

像kmp一樣,先來看一道題目 給出乙個長度為n的字串s,求s的子串t,令t反轉後t 與t完全相等,求t最大的長度。首先,可以想到用暴力做,列舉所有的子串,然後判斷,時間複雜度為o n3 第二,可以發現,如果子串s 1.5 是乙個回文串,那麼s 2.4 自然也是乙個回文串。利用這個性質,可以列舉所有串...