Skip to content

Instantly share code, notes, and snippets.

@vickonrails
Last active April 5, 2020 20:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vickonrails/8cb697acd6287e7b6a3c6084bae21f1f to your computer and use it in GitHub Desktop.
Save vickonrails/8cb697acd6287e7b6a3c6084bae21f1f to your computer and use it in GitHub Desktop.
Implementation of Knuth-Morris-Pratt string search algorithm in JavaScript
// See notes at vickon.netlify.com/notes/algorithms-and-data-structures-day-3
let = longestPrefixSuffix => {
let table = new Array(pattern.length)
let pointer = 0
table[0] = 0
for (let i = 1; i < pattern.length; i++) {
while (pointer > 0 && pattern.charAt(i) !== pattern.charAt(pointer)) {
pointer = table[pointer - 1]
}
if (pattern.charAt(i) === pattern.charAt(pointer)) {
pointer++
}
table[i] = pointer
}
return table
}
let match = (text, pattern) => {
let prefixes = longestPrefixSuffix(pattern),
matches = []
let j = 0,
i = 0
while (i < text.length) {
if (text.charAt(i) === pattern.charAt(j)) {
i++
j++
}
if (j === pattern.length) {
matches.push(i - j)
j = prefixes[j - 1]
} else if (text.charAt(i) !== pattern.charAt(j)) {
if (j !== 0) {
j = prefixes[j - 1]
} else {
i++
}
}
}
return matches
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment