/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function (haystack, needle) {
if (haystack.length == 0 || needle.length == 0) return -1;
let nextArray = new Array(needle.length);
nextArray[0] = 0;
for (let i = 0, j = 1; j < needle.length; j++) {
while (i > 0 && needle[i] != needle[j]) i = nextArray[i - 1];
if (needle[i] == needle[j]) i++;
nextArray[j] = i;
}
for (let i = 0, j = 0; i < haystack.length; i++) {
while (j > 0 && haystack[i] != needle[j]) j = nextArray[j - 1];
if (haystack[i] == needle[j]) j++
if (j == needle.length) return i + 1 - j;
}
return -1;
};