Problem.png
給定一個字符串,求該字符串的最小正周期。例如:HoHoHo,最小正周期為2。
本題看似很難通過各種循環測試出最小的重復子串,但其實可以直接利用最小正周期的定義來做。
對于一個離散函數f(n),若其最小正周期為T,那么對于定義域中每一個取值點ni,都有f(ni) = f(ni + T),故其實只需驗證字符串str中是否每一個字符ch加上周期T后都和ch相同即可,但注意最小正周期可能是整個字符串的長度,故(ch + T)要對長度len取模以回到字符串開頭。
另外本題輸出格式比較坑,每個輸出之間用一個空行隔開,但最后一個輸出只換行一次,不需要再多一個空行。
#include <iostream>
#include <string>
using namespace std;
int main() {
int N;
cin >> N;
while (N) {
string str;
cin >> str;
int len = str.length();
for (int T = 1; T <= len; T++) {
bool flag = true;
for (int i = 0; i < len; i++) {
// 周期函數的定義
// f(x) = f(x + T), for all x
if (str[i] != str[(i + T) % len]) {
flag = false;
break;
}
}
if (flag) {
cout << T << endl;
break;
}
}
N--;
if (N) {
cout << endl;
}
}
return 0;
}