串的重复

/*
题目:串的重复
内容:

代码的目标:判断一个串是否为某个基本串的简单复制构成的。

例如:
abcabcabc,它由“abc”复制3次构成,则程序输出:abc
aa 由“a”复制两次构成,则程序输出:a
axa 不是简单复制构成,则不输出任何信息
aaxx 也不是仅仅由简单复制构成,不输出信息。

请阅读下面的代码,填写缺失的部分(下划线部分)。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。

public class DaSai
{
public static void findRepeat(String x)
{
for(int i=1; i<=x.length()/2; i++)
{
String base = x.substring(0,i);
int p = i;
for(;;)
{
if(p+i>x.length()) break;
if(x.substring(p,p+i).equals(base)==false) break;
________________; // 填空1
}

if(______________) // 填空2
{
System.out.println(base);
break;
}
}
}

public static void main(String[] args)
{
findRepeat("IhaveagoodideaIhaveagoodideaIhaveagoodidea");
}
}
*/

 1 public class pro19
 2 {
 3     public static void findRepeat(String x)
 4     {
 5         for(int i=1; i<=x.length()/2; i++)
 6         {
 7             String base = x.substring(0,i);
 8             int p = i;//这里保存两个i是下面要用i当做步长去匹配,
 9             for(;;)
10             {
11                 if(p+i>x.length()) break;//这个break是匹配上的出口,和第二个填空有关系,
12                 if(x.substring(p,p+i).equals(base)==false) break;
13                 p += i;   // 填空1   //上面一行没有break,说明[0...p-1]与[p...p+i-1]匹配上了,下面要和[p+i...p+2i-1]匹配
14             }
15             
16             if(p==x.length())  // 填空2  //上面循环中,p+=i,如果在第一个语句中break了,说明p+i大于x.length(),然后这里想不通了,
17             {
18                 System.out.println(base);
19                 break;
20             }
21         }
22     }
23     
24     public static void main(String[] args)
25     {
26         findRepeat("IhaveagoodideaIhaveagoodideaIhaveagoodidea");
27     }
28 }


/*
  KMP算法没掌握,做这种题目真吃力,
*/

原文地址:https://www.cnblogs.com/wsxjbky/p/3058996.html