455 - Periodic Strings

455 - Periodic Strings_第1张图片
Problem.png

给定一个字符串,求该字符串的最小正周期。例如:HoHoHo,最小正周期为2。
本题看似很难通过各种循环测试出最小的重复子串,但其实可以直接利用最小正周期的定义来做。
对于一个离散函数f(n),若其最小正周期为T,那么对于定义域中每一个取值点ni,都有f(ni) = f(ni + T),故其实只需验证字符串str中是否每一个字符ch加上周期T后都和ch相同即可,但注意最小正周期可能是整个字符串的长度,故(ch + T)要对长度len取模以回到字符串开头。
另外本题输出格式比较坑,每个输出之间用一个空行隔开,但最后一个输出只换行一次,不需要再多一个空行。

#include 
#include 

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;
}

你可能感兴趣的:(455 - Periodic Strings)