想要知道最短週期子串出現的次數,首先要知道最短週期子串是什麼,之後由目標串的長度/最短迴圈子串的長度就可以得到最短週期子串出現的次數.假設有乙個目標串為:
abcabcabc
顯而易見:最短週期子串為abc
一是暴力查詢
**如下
#include
#include
using namespace std;
intmain()
if(str.
length()
% min !=0)
//防止出現輸入"abcab"卻輸出3的情況`在這裡插入一段**
cout << str.
length()
<< endl;
else
cout << min << endl;
return0;
}
另一種是借用kmp演算法中的next陣列實現
上述目標串的next陣列為
目標串abc
abca
bc『\0』
next陣列-10
0012
3456
記目標串總長度為n,由**可知n=9,next[9]=6,說明目標串中的第9個元素已經與前面連續重複了6個字元,也就是從字串的第n-next[9]=3個字元處開始重複,所以子串長度為3.
目標串ab
cabc
ab『\0』
next陣列-10
0012
345這裡就會發現n-next[n]=8-next[8]=3,但是實際上n=8,因為最後乙個字串沒有字元』c』導致沒有完成乙個完整的迴圈,那麼我們就需要判定,判定條件也很簡單:目標串是由字串迴圈得到的,所以判定條件(目標串的長度%迴圈子串的長度)==0
應該為真,否則乙個目標串的最長迴圈子串就是他自身.
這樣一來,這裡先判定出n-next[n]=8-next[8]=3,然後判定(8%3)==0,為假,所以最短迴圈子串是目標串自身
**如下:
#include
#include
int next[
1000005]=
;char t[
1000005];
intgetnext
(char
* t)
else}if
(n%(n-next[n])==
0)return n/
(n-next[n]);
else
}int
main()
int cc=
getnext
(t);
int n=
strlen
(t);
printf
("%d\n"
,cc);}
return0;
}
字串最小週期
如果乙個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為週期。例如,abcabcabcabc以3為週期 注意,它也可以6和12為週期,結果取最小週期3 字串的長度小於等於100,輸出它的最小週期。思路 找出最小週期,首先分析週期的特殊性,即是字串長度的約數,考慮遍歷字元長度的約數,比較字串...
趣味程式設計 最小週期串長度
在一些程式競賽裡面經常會考一些開動思維的小題目.比如週期串.什麼是週期串呢.舉例說明 abcdabcdabcdabcdabcd 即,由同乙個源字串重複n次得到的目標字串.而這個源字串就成為目標字串的週期.上面的例子中,週期是4.下面來分析一下這個問題怎麼去解答 剛接觸到這樣的題目,我首先的想法是如果...
字串出現最大次數
時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 在美麗大興安嶺原始森林中存在數量繁多的物種,在勘察員帶來的各種動物資料中有未統計數量的原始動物的名單。科學家想判斷這片森林中哪種動物的數量最多,但是由於資料太過龐大,科學家終於忍受不了,想請聰明如你的acmer來幫忙。輸入 第一...