题目描述
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。
举个例子,A = “abcd”,B = “cdabcdab”。
答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。
注意:
A 与 B 字符串的长度在1和10000区间范围内。
思路:
每重叠一次字符串A,判断字符串B是否为其子串,若是,则返回重叠次数,否则,判断循环跳出条件
public class Test686 {
public int repeatedStringMatch(String A, String B) {
//记录重叠的次数
int count = 1;
String Atemp = A;
while(true){
//返回字符串B在Atemp中第一次出现的索引,若找不到,则返回-1
int temp = Atemp.indexOf(B);
if (temp != -1){
return count;
//关键在于找到下面跳出循环的条件
/**
* 在B的长度大于A长度时且能够满足题意A叠加后B成为其子串的,总共只有四种情况
* 叠加n个A后刚好与B完全相等,例如A = 'ab', B = 'abab',此时刚好只需要循环n次即可满足条件,循环更多次也只是重复无用功
* 叠加n个A后与B的后部分完全相等,但此时B头部还有一小部分值刚好是A尾部分,例如A = 'ab', b = 'babab',此时最少需要循环n + 1次才可满足条件
* 同上一条,但多余部分出现在B的尾部,例如A = 'ab', b = 'ababa',此时最少需要的循环次数同上
* 同上,多余部分在B的头尾都有,例如A = 'ab', b = 'bababa',此时最少需要的循环次数为n + 2次
* 由上面的所有情况分析得到最少需要循环的次数为n + 2次,n为正整数,
* 转化为最小需要的长度S就是S >= (n + 2) * A.length,因为n = B.length / A.length,所以S >= B.length + A.length * 2
*/
}else if (Atemp.length() >((2*A.length())+B.length()) ){
break;
}
Atemp = Atemp+A;
count++;
}
return -1;
}
}