// Knuth–Morris–Pratt algorithm. const patternMatch = function(pattern, str) { let i = 0; let j = 0; let n = str.length; let m = pattern.length; const lps = []; // Compute longest prefix string. computeLPS(pattern, m, lps); while (i < n) { if (str.charAt(i) === pattern.charAt(j)) { i++; j++; } if (j === m) { console.log('String found at: ' + (i - j)); j = lps[j - 1]; } else if (i < n && str.charAt(i) !== pattern.charAt(j)) { if (j !== 0) { j = lps[j - 1]; } else { i++; } } } }; const computeLPS = function(pattern, m, lps) { let i = 1; let len = 0; while (i < m) { if (pattern.charAt(i) === pattern.charAt(len)) { lps[i++] = ++len; } else { if (len > 0) { len = lps[len - 1]; } else { lps[i++] = 0; } } } }; patternMatch('john', 'helloworldjohnhelloworldjohnn'); /* "String found at: 10" "String found at: 24" */
Categories