ACM學習歷程23 最小週期串問題

2021-07-22 06:17:22 字數 1110 閱讀 6563

最小週期串問題屬於字串操作的基本題型之一,要求給定乙個字串找出其中最小的週期長度和最小週期子串。對於週期串的定義如下:如果乙個字串是以乙個或者乙個以上的長度為k的重複字串連線成的,那麼這個字串就叫做週期為k的串。找最小週期串的方法可以通過以下方式實現:

一、從字串的起始位置遍歷,對於字串長度為n的字串,那麼週期串的可能長度介於1—n之間,所以可以假設週期串的長度為i,其中1<=i<=n。滿足最小週期串的條件之一是length%i==0,這是因為如果所述i是字串的週期串長度,那麼整個字串可以被劃分成整數個長度為i的週期子串,如果這個整除的條件不成立,說明i也不是字串的週期串長度。滿足最小週期串的條件之二是,變數j從i的位置開始一直到字元處結束的位置,滿足(s[j]!=s[j%i])這個條件,這是因為若從0到i-1這個區間組成的子串是該字串的週期串,那麼從i到length-1的位置是該最小字串的若干次重複。由於上述i的取值是從1即從最小值開始取值的,因此當上述兩個條件都成立時,即可求得最小週期串長度和最小週期串。

#include#includeusing namespace std;

int main()

{ int i,j;

int flag;//判斷最小週期串是否找到,找到值為1,否則為0

char ss[100];

string s;

while(cin.getline(ss,100))

{ s=ss;

int length=s.length();

for(i=1;i<=length;i++)

{ if(length%i==0)

{flag=1;

for(j=i;j

#include#includeusing namespace std;

int main()

{ int i;

char ss[100];

string s;

while(cin.getline(ss,100))

{ s=ss;

int length=s.length();

for(i=1;i<=length;i++)

{ if(length%i==0)

{int j=i,k=0,n=1;

while(j

字串最小週期

如果乙個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為週期。例如,abcabcabcabc以3為週期 注意,它也可以6和12為週期,結果取最小週期3 字串的長度小於等於100,輸出它的最小週期。思路 找出最小週期,首先分析週期的特殊性,即是字串長度的約數,考慮遍歷字元長度的約數,比較字串...

趣味程式設計 最小週期串長度

在一些程式競賽裡面經常會考一些開動思維的小題目.比如週期串.什麼是週期串呢.舉例說明 abcdabcdabcdabcdabcd 即,由同乙個源字串重複n次得到的目標字串.而這個源字串就成為目標字串的週期.上面的例子中,週期是4.下面來分析一下這個問題怎麼去解答 剛接觸到這樣的題目,我首先的想法是如果...

最小週期字串出現次數

想要知道最短週期子串出現的次數,首先要知道最短週期子串是什麼,之後由目標串的長度 最短迴圈子串的長度就可以得到最短週期子串出現的次數.假設有乙個目標串為 abcabcabc 顯而易見 最短週期子串為abc 一是暴力查詢 如下 include include using namespace std i...