1088 最長回文子串

2021-08-18 21:12:02 字數 1826 閱讀 8898

1088 最長回文子串

基準時間限制:1 秒 空間限制:131072 kb 分值: 0 

難度:基礎題

回文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。

輸入乙個字串str,輸出str裡最長回文子串的長度。

input

輸入str(str的長度 <= 1000)
output

輸出最長回文子串的長度l。
input示例

daabaac
output示例

5
基於manacher演算法的一種方法,如果資料過大不可行manacher看這個->1089 最長回文子串 v2(manacher演算法)首先,manacher演算法提供了一種巧妙地辦法,將長度為奇數的回文串和長度為偶數的回文串一起考慮,具體做法是,在原字串的每個相鄰兩個字元中間插入乙個分隔符,同時在首尾也要新增乙個分隔符,分隔符的要求是不在原串中出現,一般情況下可以用#號。下面舉乙個例子:

manacher演算法用乙個輔助陣列len[i]表示以字元t[i]為

中心

的最長回文子串的

最右字元到t[i]的長度

。比如:len[8]=4->  以b為中心的最長回文子串是#a#

b#a#,從最右字元到b長度為4。

對於上面的例子,可以得出len[i]陣列為:

對於以t[i]為中心的最長回文字串,其長度就為2*len[i]-1。(len[8]->4*2-1)

經過觀察可知,t中所有的回文子串,其中#的數量一定比其他字元的數量多 1,也就是有len[i]個分隔符,剩下len[i]-1個字元來自原字串,所以該回文串在原字串中的長度就為len[i]-1。

有了這個性質,那麼原問題就轉化為求所有的len[i]。

設每次len[i]為j。

還是以len[8] (#a#

b#a#) 為例:

記i為最長回文子串中心在t中的位置,i=8。初始j=1。

if(s[i-j]==s[i+j]) j++;  //關鍵**

解析:i=8,j=1—>s[7]==s[9]  j=2;

i=8,j=2—>s[6]==s[10]  j=3;

i=8,j=3—>s[5]==s[11]  j=4;

由上可知,每次j++,就是由中心位置向兩邊繼續擴,如果兩邊相等,繼續向外擴。

一共可以向外擴多少,說明兩邊相同的字元有多少對,再加上中心(j的初始值1),最後j的值就是該中心值len。

**:

#include#includeusing namespace std;

char str[12000];

char s[12000];

int main()

s[0]=s[1]='#';

n=strlen(s);

for(i=2;i=1&&i+jmaxx)

maxx=temp;

}cout<

return 0;

}

1088 最長回文子串

基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 收藏關注 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸出最長回文子串的長度...

51nod 1088 最長回文子串

回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸出最長回文子串的長度l。input示例 daabaacoutput示例 5 解法一 暴力列舉所有串 若當前列舉串...

51 nod 1088 最長回文子串

1088 最長回文子串 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏 關注 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。輸入乙個字串str,輸出str裡最長回文子串的長度。input 輸入str str的長度 1000 output 輸...