友友们我上一篇KMP算法一定要学,今天就是梅开二度。
686. 重复叠加字符串匹配 https://leetcode.cn/problems/repeated-string-match/description/
相关KMP算法知识这篇不再赘述,一定要先看上一篇,再看这一篇,按顺序食用
知识点一.临界条件
能匹配到的情况下是这样的
那匹配不到呢?就是当i指针已经走完一个a串了,j指针还是没有动
此时i-j>a串的长度作为判断寻找模式串结束的条件 。
知识点二.取余
其实我们开始并不知道应该用多少个a串,我们只知道b串,
那应该怎么做呢?
我们知道a串会循环abcd,abcd,...所以我们只要一直走a串就好,
那怎么一直走a串呢?
去余就好了。i%.n就能保证一直走a串了,这样最后能找到落在哪个索引上
所以上面的例子变成这样
所以最后我们知道 ,结束匹配后,索引的位置了
知识点三.通过索引求需要几个a串
附上代码
var repeatedStringMatch = function(a, b) {
var m = a.length;
var n = b.length
let next = new Array(n).fill(0);
var number = -1;
next[0] = 0;
//找next数组
for(var j=0,i=1;i<=b.length-1;i++){
while(j>0&&b[i] !== b[j]){
j=next[j-1]
}
if(b[i] == b[j]){
j++;
}
next[i] = j;
}
//知识点一。临界条件
for(var i=0,j=0;i-j<m;i++){
//知识点二.取余
while(j>0&& a[i%m] !== b[j]){
j=next[j-1]
}
if(a[i%m] === b[j]){
j++
}
//判断当短串走完,把当前索引记录到number中
if(j === n) {
number = i-j+1;
break;
}
}
if(number === -1){
return -1
}else{
//知识点三。通过索引求需要多少a串
return Math.ceil((number+n)/m)
}
};