题目:
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。
举个例子,A = “abcd”,B = “cdabcdab”。
答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。
注意:
A 与 B 字符串的长度在1和10000区间范围内。
思路:其实思路就是我们长串中找是否存在字符子串的题目;我们需要做的就是现在主串短,我们需要在将他重复比较,那么用%是最好的。 对于边界条件,如果从主串的最后一个字符开始匹配还不成功,那么肯定不是子串。所以判断不成功的条件就是当i大于两个字符串的长度相加。那么肯定匹配不成功,匹配成功过的条件,那么自然时j大于子串的长度;
- 如果不懂KMP算法,请点击 KMP算法详解
- 相关习题 KMP算法解决主串(s2)里面有几个子串(s1)
class Solution {
public int [] kmp(String B){
int [] next=new int [B.length()];
next[0]=-1;
if(B.length()==1){
return next;
}
next[1]=0;
int k=0;
int j=2;
while(j<next.length){
if(k==-1 || B.charAt(k)==B.charAt(j-1)){
next[j++]=++k;
}else{
k=next[k];
}
}
return next;
}
public int repeatedStringMatch(String A, String B) {
int [] next=kmp(B);
int i=0;
int j=0;
int n=0;
while(j<B.length()){
if(j==-1 || A.charAt(i)==B.charAt(j)){
if(i==A.length()-1){
i=0;
}else{
i++;
}
j++;
n++;
}else{
j=next[j];
}
if(n>A.length()+B.length()){
return -1 ;
}
}
return n%A.length()==0 ? n/A.length() : n/A.length()+1 ;
}
}