自学内容网 自学内容网

【一本通】PowerStrings

【一本通】PowerStrings


💐The Begin💐点点关注,收藏不迷路💐

求每个字符串的最短循环子串,输出循环次数。

输入

输入数据为多组数据,读取到"."字符时结束。每组数据仅有一行,长不会超过1000000个字符

输出

对于每组数据,输出一行,一个整数表示这个字符串的最短循环子串的循环次数。

样例输入

abcd
aaaa
ababab

样例输出

1
4
3

C++ 代码

#include <iostream>
#include <string>
using namespace std;
// 判断字符串s从索引start开始长度为len的子串是否是循环节
bool isCycle(const string& s, int start, int len) {
    int n = s.size();
    for (int i = start + len; i < n; i++) {
        if (s[i]!= s[i - len]) return false; // 如果对应位置字符不相等,不是循环节
    }
    return true;
}
int main() {
    string s;
    while (cin >> s && s!= “.”) { // 循环读取输入,直到遇到.结束
        int n = s.size();
        for (int i = 1; i <= n; i++) { // 尝试不同长度的子串作为可能的循环节
            if (n % i == 0) { // 如果当前长度能整除字符串长度
                if (isCycle(s, 0, i)) { // 判断是否是循环节
                    cout << n / i << endl; // 输出循环次数
                    break;
                }
            }
        }
    }
    return 0;
}

C语言代码

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 判断字符串s从索引start开始长度为len的子串是否是循环节
bool isCycle(const char* s, int start, int len) {
    int n = strlen(s);
    for (int i = start + len; i < n; i++) {
        if (s[i]!= s[i - len]) return false; // 如果对应位置字符不相等,不是循环节
    }
    return true;
}
int main() {
    char s[1000001];
    while (scanf(“%s”, s) == 1 && strcmp(s, “.”)!= 0) { // 循环读取输入,直到遇到.结束
        int n = strlen(s);
        for (int i = 1; i <= n; i++) { // 尝试不同长度的子串作为可能的循环节
            if (n % i == 0) { // 如果当前长度能整除字符串长度
                if (isCycle(s, 0, i)) { // 判断是否是循环节
                    printf(“%d\n”, n / i); // 输出循环次数
                    break;
                }
            }
        }
    }
    return 0;
}

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

原文地址:https://blog.csdn.net/qq_41840843/article/details/144458679

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!