1. 程式人生 > >在風雨中奔跑

在風雨中奔跑

如果一個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為週期。例如,abcabcabc以3為週期(注意,它也以6和12為週期)。輸入一個長度不超過80的串,輸出它的最小週期。

樣例輸入:HoHoHo

樣例輸出:2

  從網上搜索這道題目許久,一直沒有什麼收穫,有些的只有程式碼或者有些的只有少量的註釋。

解析:

 字串的週期一定與長度構成len%T=0 如果不能就不可能組成周期 ,而週期的範圍1<=T<=len。

要成周期必須對應相同。 

都是對應的情況,不能存在交叉。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    char word[100];
    scanf("%s",word);
    int len=strlen(word);
    for(int i=1;i<=len;i++)
        if(len%i==0)//週期必須為len的倍數
        {
			int ok=1;
			for(int j=i;j<len;j++)
				if(word[j]!=word[j%i])//在i是為週期,而j%i與j相隔幾個週期的比較,如果中間有一個不相同,將會退出循壞,加長週期,此處不懂請看程式碼下面的。
				{
					ok=0;break;
				} 
				if(ok)
				{
					printf("%d\n",i);break;
				}
		}
		return 0;
		
} 


舉個例子來推出:

假設  i =4;  l=8;  意味週期也為4;

i          j            j%i 

4       4            0

4       5            1

4       6             2

4       7             3

 0-->4,   1-->5,  2-->6; 3-->7;是對應的。