串算法之周期串

                         首先什么是周期串,举个简单的例子:abcabcabcabc,这个字符串叫做周期串,这个周期串中的abc,abcabc,abcabcabc就是它的子串,他的周期是3,6,12。怎么理解?

                        abc的长度是3重复的出现四次它的周期是3

                        abcabc长度是6重复的出现2次它的周期是6

                        abcabcabcabc长度是12重复出现1次它的周期是12

                         现在我们要实现一个算法来输出它的周期

#include<iostream>
#include<string> 


int main()
{
	char word[100];
	memset(word,'\0',sizeof(char));
	std::cin.getline(word,100,'\n'); 
	int len=strlen(word); 
	for(int i=1;i<len;i++)
	{
		if(len%i==0)
		{ 
			int ok=1; 
			for(int j=i;j<len;j++)
			{
				if(word[j]!=word[j%i])
				{
					ok=0; 
					break; 
				}			
			} 
			if(ok)
			{
				std::cout<<i<<std::endl; 
			} 
		} 
	} 
	std::cout<<len<<std::endl; 
	
	return 0; 
} 


 

来说明一下上面的代码,首先我们假设这个周期串的长度为i,则根据这个word的长度,我们这个周期串的周期可能是1,2,3,4...len。所以外面套一个for循环用来遍历各种可能出现周期,然后我们从周期长度的下一个位置开始和前面那个周期子串中的字符逐个的比较,如果发现出现一个不相等了,说明这个串长到此结束。这样说还是有点抽象,我们来看一下下面的图

                

由上图可以清楚的得出,j=4的时候j%i=0,所以word[0]必须要和word[4]相等,以此类推可以知道word[1]=word[5],word[2]=word[6]...word[j]!=word[i%j]得出一个周期然后执行下次循环计算下一个周期。

结果:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值