最小週期字串出現次數

2021-10-02 19:06:31 字數 1491 閱讀 4212

想要知道最短週期子串出現的次數,首先要知道最短週期子串是什麼,之後由目標串的長度/最短迴圈子串的長度就可以得到最短週期子串出現的次數.

假設有乙個目標串為: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來幫忙。輸入 第一...