串的重复
/*
题目:串的重复
内容:
代码的目标:判断一个串是否为某个基本串的简单复制构成的。
例如:
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算法没掌握,做这种题目真吃力,
*/