Skip to content

Instantly share code, notes, and snippets.

@simsicon
Last active December 5, 2016 03:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simsicon/a78698858bea3e7e28310378682bd30a to your computer and use it in GitHub Desktop.
Save simsicon/a78698858bea3e7e28310378682bd30a to your computer and use it in GitHub Desktop.
def kmp(text, pattern):
partial = [0]
for i in range(1, len(pattern)):
j = partial[i - 1]
while j > 0 and pattern[j] != pattern[i]:
j = partial[j - 1]
partial.append(j + 1 if pattern[j] == pattern[i] else j)
ret = []
for i in range(len(text)):
while j > 0 and text[i] != pattern[j]:
j = partial[j - 1]
if text[i] == pattern[j]: j += 1
if j == len(pattern):
ret.append(i - (j - 1))
j = 0
return ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment