description:編寫程式求給出的字串中的最長迴圈子串。
input:
agbhkddkhbtr
output:
bhkddkhb
方法1: 中心擴充套件法
演算法思想: 從左到右將每乙個字元當作回文串的中心,進行擴充套件,以此找到最長的回文串。
時間複雜度: 擴充套件後的字串長度為(2 * n + 1), 對每乙個字元擴充套件,故複雜度為o(n^2)
#include
#include
#include
#define maxn 1010
char str[maxn]
;char s[maxn]
;int st , maxlen;
//st是最長回文子串的中心,maxlen是其長度
// 由於字串奇數偶數有不同的處理,為了簡便,將原字串擴充套件,即在每個字元
//前加入乙個'#',同時最後乙個字元後加乙個'#',這樣字串長度都變為奇數。
//例如: abababa -------> #a#b#a#b#a#b#a#
void
getstring
(char str)
}void
getmaxpalindrome
(char str)
if(plen > maxlen)}}
intmain()
方法2:manacher演算法
關於manacher演算法具體介紹可以參考一些其它部落格。
時間複雜度: o(n)
#include
#include
#include
#include
#define maxn 1010
char s[maxn]
;int parr[maxn]
, st , maxlen;
void
getstring
(char str)
intmin
(int a ,
int b)
void
manacher
(char str)
if(i + parr[i]
> r)
if(parr[i]-1
> maxlen)}}
intmain()
poj 2046 迴圈子串問題
題目 poj 2046 這個題目有個結論 若s存在迴圈子串,當且僅當,len可以被len prefix len 1 整除。連線次數為len len prefix len 1 充分性我不會證明,我就證明下必要性吧。不放假設s pattern n len strlen s 顯然prefix len 1 ...
C語言 最長回文子串
描述 輸入乙個字串,求其中最長回文子串。子串的含義是 在字串中連續出現得字串片段。回文的含義是,正著看和倒著看是相同的,如abba何abbebba。在判斷時要求忽略所有的標點和空格,且忽略大小寫。但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000.且單獨佔一行。輸入 ...
C語言 最長回文字串
馬拉車演算法現在僅僅是看懂,以後會回來填坑。動態規劃的本質就是求表 但是遞推式很難求 這裡設定乙個二維陣列jud 10 10 有jud i j jud 1 8 的意義是判斷位置1的字元到位置8的字元形成的字串是否為回文字串 所以必有ij的部分全部設定為0。true為1,false為0 判斷是否為回文...