《入门经典》——6.22

周期字符串:

  如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。

  样例输入:HoHoHo

  样例输出:2

  分析:基于这道题目的数据量,这里利用基本的穷举法就可以解决。我们从这个字符串的头元素开始,从小到大枚举最小周期串的长度,然后判断其是否是周期串,如果是周期串,直接输出当前枚举的值然后程序终止。

  那么现在我们面临的一个问题是,如何判断从头元素开始长度为i的子串是否是这个字符串的周期串,我们从母串s的第i位开始往后枚举,用临时变量j来记录当前位置,一旦出现s[j%i] != s[j],则可立马断定当前子串不是周期串,跳出循环枚举下一个长度。

  其伪代码如下:

  for i ,1 to len

     if(len % i== 0

{

           for j , i to len

               if(s[j] != s[j%i])   当前子串不是周期串;

        }

  简单的参考代码如下:

#include<cstdio>

#include<iostream>

#include<cstring>

const int maxn = 85;

using namespace std;

char s[maxn];

int main()

{

          while(cin>>s)

          {

              int len = strlen(s);

               for(int i = 1;i <= len;i++)

                     if(len % i == 0)

                   {

                       int ok = 1;

                       int index = 0;

                        for(int j = i;j < len;j++)

                        {

                             if(s[j] != s[j % i])  {ok = 0;break;}

 

                        }

                        if(ok)  {printf("%d\n",i);break;}

                        else      continue;

                   }

          }

}    

 

posted on 2016-06-25 09:09  在苏州的城边  阅读(149)  评论(0编辑  收藏  举报

导航