about summary refs log tree commit diff
path: root/scratch/facebook/hard/suffix-tree.py
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-11-19T21·12+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-11-19T21·12+0000
commitfa717e8a6f3edb27bcc4dc5f86f5bac6b0b449e9 (patch)
tree57544124861db3c6829f20188f6229f34dfbd8e9 /scratch/facebook/hard/suffix-tree.py
parent1088e4143df5292eee487df17c350563a7d31fd0 (diff)
Re-implement suffix_tree function
Create a suffix tree from an input string. This implementation uses a stack to
control the flow of the program.

I expected this attempt to be easier than my first attempt, but surprisingly, it
was similarly difficult. It took me ~30-45 minutes to successfully implement
this function, and I'm still not pleased with the final result.
Diffstat (limited to 'scratch/facebook/hard/suffix-tree.py')
-rw-r--r--scratch/facebook/hard/suffix-tree.py29
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