diff options
Diffstat (limited to 'scratch/facebook/hard/suffix-tree.py')
-rw-r--r-- | scratch/facebook/hard/suffix-tree.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/scratch/facebook/hard/suffix-tree.py b/scratch/facebook/hard/suffix-tree.py index 600d06591bdb..782678fb822c 100644 --- a/scratch/facebook/hard/suffix-tree.py +++ b/scratch/facebook/hard/suffix-tree.py @@ -1,4 +1,5 @@ import random +from collections import deque def exists(pattern, tree): """ @@ -42,6 +43,34 @@ def suffix_tree(xs): parent = children return root +def suffix_tree(x): + """ + Creates a suffix from the input string, `x`. This implementation uses a + stack. + """ + result = [None, []] + q = deque() + for i in range(len(x)): + q.append((result, x[i:])) + while q: + parent, x = q.popleft() + s = [] + s.append((parent, x)) + while s: + parent, x = s.pop() + if not x: + continue + c, rest = x[0], x[1:] + grafted = False + for child in parent[1]: + if c == child[0]: + s.append((child, rest)) + grafted = True + if not grafted: + child = [c, []] + parent[1].append(child) + s.append((child, rest)) + return result[1] ################################################################################ # Tests |