Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.35 KB | None | 0 0
  1.  
  2. def next_char(stream):
  3.     for c in stream:
  4.         yield c
  5.  
  6.  
  7. def create_trie(words):
  8.     root = dict()
  9.     for word in words:
  10.         node = root
  11.         for w in word:
  12.             node = node.setdefault(w, {})
  13.         node['END'] = 'END'
  14.     return root
  15.  
  16.  
  17. def count_words(s, words):
  18.     trie = create_trie(words)
  19.     stored_keys = []
  20.     counters = {word: 0 for word in words}
  21.  
  22.     for s in next_char(s):
  23.         # Compare with store keys
  24.         for k in [x for x in stored_keys if len(x) > 0]:
  25.             # Go to the current level
  26.             trie_level = trie  # root
  27.             word = ''
  28.             for level in k:
  29.                 word += level
  30.                 trie_level = trie_level[level]  # Go to next level
  31.  
  32.             # What do we've on this level
  33.             if s in trie_level.keys():
  34.                 #Check next if it ends
  35.                 if 'END' in trie_level[s]:
  36.                     counters[word+s] += 1
  37.                     k.clear()
  38.                 else:
  39.                     k.append(s)
  40.             else:  # Doesn't match
  41.                 k.clear()
  42.  
  43.         # Compare with root
  44.         if s in trie.keys():
  45.             stored_keys.append([s])
  46.  
  47.     return counters
  48.  
  49. if __name__ == '__main__':
  50.     stream = 'acacabcatghhellomvnsdb'
  51.     words = ["aca","cat","hello","world"]
  52.     print(count_words(stream, words))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement