var strStr = function(haystack, needle) {
//如果目标字符串长度为0,则返回0
if(needle.length===0){
return 0
}
//目标字符串长度不为0
//找到next[]
//初始化,next为空,第一个值为0
let next=[]
let j=0
next.push(j)
for(let i=1;i<needle.length;i++){
//如果指针i和j的值不相等,则执行回退操作
while(j>0&&needle[i]!==needle[j]){
//当前元素为needle[j]
//j回退到当前元素的前一个next[]值的下标
j=next[j-1]
}
if(needle[i]==needle[j]){
j++
}
//记录当前最长公共字串
next.push(j)
}
//匹配文本字串haystack
let p=0 //指向needle
//遍历haystack
for(let x=0;x<haystack.length;x++){
while(p>0&&haystack[x]!==needle[p]){
p=next[p-1]
}
if(haystack[x]==needle[p]){
p++
}
//匹配完整
if(p===needle.length){
return (x-needle.length+1)
}
}
return -1
};