在風雨中奔跑
阿新 • • 發佈:2019-02-01
如果一個字串可以由某個長度為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;是對應的。