输入一行字符串
求字符串的周期
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;
}
}
}
}