码迷,mamicode.com
首页 > 其他好文 > 详细

《入门经典》——6.22

时间:2016-06-25 09:39:15      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

周期字符串:

  如果一个字符串可以由某个长度为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;

                   }

          }

}    

 

《入门经典》——6.22

标签:

原文地址:http://www.cnblogs.com/rhythmic/p/5615796.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!