求周期串的周期(字符串)

输入一行字符串

求字符串的周期

eg  abcabc    周期为3

        abcde    周期为5

求解本内容的方法思路本文列举三个。

1、从数学的角度分析

        对应位置是否相等

public static void zqcl(String s) 
	{
		char[] f=s.toCharArray();	// 转化为字符数组方便操作
		boolean isok=true;	// 假设当前的周期是合理的
		int t;	// 周期,把所有可能的周期都试探一遍
		for(t=1;t<=s.length();t++) 
		{
			if(f.length%t==0) 	// 周期串的长度肯定是周期t的倍数
			{
				isok=true;	// 假设当前t确实为周期
				for (int start = t; start < f.length; start++) 
				{
					if(f[start]!=f[start%t])
					{
						isok = false;
						break;	// 本轮的检测结束
					}
				}
				if(isok==true)break;	// 所有的检测结束,t都符合,停止循环,so当前t就是最小正周期
			}
		}
		System.out.println(t);
	}

2、

        截取一部分子串与后面进行不断的对比,最差的情况下,是整个s长度。

        这里可以通过画图理解

public static void zqcxz(String s) 
	{
		String s2=s+s; // 扩展为2倍,方便取长度为s.length()子串
		int pos=1;	// 不能从0开始,否则自己等于自己了捏
		for(pos=1;pos<=s.length();pos++)
		{
			if(s.length()%pos!=0)continue;
			String s3=s2.substring(pos,pos+s.length());
			if(s3.equals(s))break;
		}
		System.out.println(pos);
	}

 

3、通过replace()函数的方法,巧求

public static void zqccg(String s)
	{
		for(int len=1;len<=s.length();len++)
		{
			
			if(s.length()%len==0)
			{
				String sub=s.substring(0,len); 
				// 也是试探周期,但是这次使用replace,当sub是周期串时,可以将其全部替换为空
				// 这个时候,len就是最小正周期
				if(s.replace(sub, "").length()==0)
				{
					System.out.println(len);
					break;
				}
			}
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值