1088 最長回文子串
基準時間限制:1 秒 空間限制:131072 kb 分值: 0
難度:基礎題
回文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。
輸入乙個字串str,輸出str裡最長回文子串的長度。
input
輸入str(str的長度 <= 1000)output
輸出最長回文子串的長度l。input示例
daabaacoutput示例
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 輸...