function kmp(s, p) {
var m = 0, i = 0,
k, j, h,
slen = s.length,
plen = p.length;
/* converting string */
s = s.split("");
p = p.split("");
/* preprocessing */
h = [0];
for ( k = 1, j = 0; k < plen; ) {
if ( p[k-1] === p[j] ) {
h[k] = j + 1;
k++; j++;
}
else if ( j > 0 )
j = h[j];
else
h[k++] = 0;
}
/* search operation */
while ( m + i < slen ) {
if ( s[m+i] === p[i] ) {
i++;
if ( i === plen )
return m;
}
else {
m += i - h[i];
if ( h[i] > -1 )
i = h[i];
else
i = 0;
}
}
return -1;
}
|