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

2021-07-10 23:22:05 字數 999 閱讀 6097

在一些程式競賽裡面經常會考一些開動思維的小題目.比如週期串.什麼是週期串呢.

舉例說明 : abcdabcdabcdabcdabcd

即, 由同乙個源字串重複n次得到的目標字串.而這個源字串就成為目標字串的週期.上面的例子中,週期是4.

下面來分析一下這個問題怎麼去解答:

剛接觸到這樣的題目,我首先的想法是如果乙個字串是週期串,那麼它的字串也是週期字串...但是其實是不對的.比如上面這個例子就能很好的說明問題.

那麼這個思路能不能再做一下容錯來完成這個問題的解答呢.想來想去,貌似不行.只能另闢蹊徑,換個思路.

首先應該仔細的去分析一下週期字串的特點:

1. 字串以週期做迴圈.即 : 如果確定了這個週期,那麼後面的所有這個週期都應該和前面的匹配才是.

2. 字串的長度一定可以對週期進行取餘.這個應該很好理解.應為字串的總長度一定是週期的整數倍.

3. 乙個週期字串,最大週期是它本身,最小週期是1.

有了這三個特徵,相比可以分析一些思路出來了.

1. 遍歷週期長度,從1到字串長度

2. 遍歷字串.與前面的字串進行比較.就是說,如果我第一步假定長度是4, 那麼這一步直接從下標4開始,然後和下標0去比對,然後下標5和下標1比對...一直到字串長度耗盡...

下面給出實現** : 

#include #include #include #include #include char *roll = "abcdabcdabcdabcdabcd";

int main(int argc, char **argv)

int ok = 0;

for (j = i; j < len; j++)

}if (ok == 0)

}return 0;

}

上面程式中的 len % i 是做一下容錯,因為如果len不能整除i,那麼就沒有必要去遍歷這個長度了.

問題完美解決,不知道有沒有更好的解法,反正我還沒有想出來...

字串最小週期

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

最小週期字串出現次數

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

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

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