给定一个字符串,求该字符串的最小正周期。例如: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;
}
网友评论