蓝桥杯 算法提高 周期字串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32734731/article/details/54869272

算法提高 周期字串
时间限制:1.0s 内存限制:256.0MB
提交此题
问题描述
  右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
  我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
  例如:
  字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
  右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
输入格式
  一个最大长度为100的无空格的字符串。
输出格式
  一个整数,表示输入的字符串的最小周期。
样例输入
HaHaHa
样例输出
2
样例输入
Return0
样例输出
7

暴力枚举,一个个的长度枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
    string a;
    while(cin>>a)
    {
        int z;
        int mins=10000;


            for(int j=1;j<=strlen(&a[0])/2;j++)//枚举长度
            {
                if(strlen(&a[0])%j!=0) continue;//判断字符串是否可能成周期。就是是否能除尽
                z=1;
                int k=0;
                string c,d;
                for(;k<j;k++) c+=a[k];
                while(k<strlen(&a[0]))
                {
                    d+=a[k];
                    //cout<<c<<' '<<d<<' '<<j<<' '<<k<<endl;
                    k++;
                    if(strlen(&d[0])==j)
                    {
                        if(d==c)
                        {
                            d.clear();
                        }
                        else
                        {
                            z=0;
                            break;
                        }
                    }
                }
                if(z)
                {
                    mins=j;
                    break;
                }
            }
            if(z)cout<<mins<<endl;
            else cout<<strlen(&a[0])<<endl;
    }
}


展开阅读全文

没有更多推荐了,返回首页