60 KiB
Exercise: Find the anagrams for all words in a list¶
- You are given an English dictionary containing M words (“the dictionary”), and a separate list of N words (“the input”, saved in the file
words_to_search.txt) - For each word in the input, find all the anagrams in the dictionary (e.g., for input 'acme' the anagrams are
['acme', 'came', 'mace'])
How to proceed?
- Write an algorithm to find all anagrams for one input word first
- What is the Big-O class of this algorithm when executed the full N-words input?
- Is there a way to pre-process the dictionary to improve the Big-O performance?
1. Load the system dictionary and the input words¶
# Load the system dictionary
with open('/usr/share/dict/words', 'r') as f:
dict_words = [w.strip() for w in f.readlines()]
# Print the start and end of the dictionary
dict_words[:5] + ['...'] + dict_words[-5:]
['A', 'a', 'aa', 'aal', 'aalii', '...', 'zythem', 'Zythia', 'zythum', 'Zyzomys', 'Zyzzogeton']
# Load the input words
with open('words_to_search.txt', 'r') as f:
words = [w.strip() for w in f.readlines()]
# Print the start and end of the input list
words[:5] + ['...'] + words[-5:]
['acer', 'acers', 'aces', 'aches', 'acme', '...', 'yap', 'yaw', 'yea', 'zendo', 'zoned']
2. Look for the anagrams of one input word, e.g. "organ"¶
There are several anagrams, including "groan" and "argon".
What is the Big-O performance oh your algorithm? In terms of M, the number of words in the dictionary, and K, the number of letters in a word
word = 'organ'
anagrams = []
for dict_word in dict_words: # O(M)
if sorted(word) == sorted(dict_word): # 2 * O(K log K) ~ O(K log K)
anagrams.append(dict_word) # O(1)
anagrams
['angor', 'argon', 'goran', 'grano', 'groan', 'nagor', 'orang', 'organ', 'rogan']
The performance of this implementation is O(M * K log K).
Note that instead of sorting , we could use a dictionary mapping letters to letter counts. This would make the performance even better, O(M * K)! However, in practice it would make little difference and would make the code more complicated, so we'll leave it like this.
3. Look for the anagrams of the words in the input list¶
- How does the Big-O performance of your one-word implementation scale to an input list of M words?
- Is there a way to pre-process the dictionary words in a data structure that is better suited for this task?
# Naive implementation, it takes a long time
def find_anagrams(word, dict_words):
anagrams = []
for dict_word in dict_words: # O(N)
if sorted(word) == sorted(dict_word): # O(K log K)
anagrams.append(dict_word) # O(1)
return anagrams
words_anagrams = []
for word in words: # O(M)
anagrams = find_anagrams(word, dict_words)
words_anagrams.append((word, anagrams)) # O(1)
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) Cell In[18], line 12 10 words_anagrams = [] 11 for word in words: # O(M) ---> 12 anagrams = find_anagrams(word, dict_words) 13 words_anagrams.append((word, anagrams)) Cell In[18], line 6, in find_anagrams(word, dict_words) 4 anagrams = [] 5 for dict_word in dict_words: # O(N) ----> 6 if sorted(word) == sorted(dict_word): # O(K log K) 7 anagrams.append(dict_word) # O(1) 8 return anagrams KeyboardInterrupt:
The complexity of this algorithm is O(M * N * KlogK), where M is the length of the list of words to search, N is the length of words in the dictionary, and K is the length of words.
What if we pre-process the dictionary in a data structure that is better suited for this task?¶
anagrams_map = {}
for dict_word in dict_words: # O(N)
letters = tuple(sorted(dict_word)) # O(K log K)
if letters not in anagrams_map: # O(1)
anagrams_map[letters] = [] # O(1)
anagrams_map[letters].append(dict_word) # O(1)
words_anagrams = []
final_words = []
for word in words: # O(M)
letters = tuple(sorted(word)) # O(K log K)
if letters not in anagrams_map: # O(1)
print('This word is not in the system dictionary -- skipping', word)
continue
else:
final_words.append(word)
words_anagrams.append((word, anagrams_map[letters])) # O(1)
words_anagrams
[('acer', ['acre', 'care', 'crea', 'race']),
('acers', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('aces', ['case', 'esca']),
('aches', ['chase']),
('acme', ['acme', 'came', 'mace']),
('acned', ['dance', 'decan']),
('acre', ['acre', 'care', 'crea', 'race']),
('acres', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('act', ['act', 'cat']),
('acts', ['cast', 'scat']),
('acyl', ['acyl', 'clay', 'lacy']),
('add', ['add', 'dad']),
('adverb', ['adverb']),
('aesc', ['case', 'esca']),
('aether', ['heater', 'hereat', 'reheat']),
('aethers', ['thereas']),
('afield', ['afield', 'defial']),
('aft', ['aft', 'fat']),
('agree', ['agree', 'eager', 'eagre']),
('agrees', ['grease']),
('ags', ['gas', 'sag']),
('ah', ['ah', 'ha']),
('ahs', ['ash', 'sah', 'sha']),
('aide', ['aide', 'idea']),
('aides', ['aside']),
('airings', ['raising']),
('airmen', ['marine', 'remain']),
('alloy', ['alloy', 'loyal']),
('almes', ['amsel', 'mesal', 'samel']),
('alp', ['alp', 'lap', 'pal']),
('alps', ['salp', 'slap']),
('altern', ['altern', 'antler', 'learnt', 'rental', 'ternal']),
('altrices', ['altrices', 'selictar']),
('alts', ['last', 'salt', 'slat']),
('am', ['am', 'ma']),
('amen', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),
('amp', ['amp', 'map', 'pam']),
('amps', ['samp', 'spam']),
('anglist', ['lasting', 'salting', 'slating', 'staling']),
('anils', ['sinal', 'slain', 'snail']),
('ant', ['ant', 'nat', 'tan']),
('antis', ['saint', 'satin', 'stain']),
('antler', ['altern', 'antler', 'learnt', 'rental', 'ternal']),
('antlers', ['saltern', 'starnel', 'sternal']),
('any', ['any', 'nay', 'yan']),
('ape', ['ape', 'pea']),
('aper', ['aper', 'pare', 'pear', 'rape', 'reap']),
('apt', ['apt', 'pat', 'tap']),
('arb', ['bar', 'bra', 'rab']),
('arc', ['arc', 'car']),
('arcs', ['scar']),
('are', ['aer', 'are', 'ear', 'era', 'rea']),
('ared', ['ared', 'daer', 'dare', 'dear', 'read']),
('ares', ['arse', 'rase', 'sare', 'sear', 'sera']),
('argle', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),
('aril', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('arising', ['raising']),
('arm', ['arm', 'mar', 'ram']),
('armpit', ['armpit', 'impart']),
('arms', ['arms']),
('arse', ['arse', 'rase', 'sare', 'sear', 'sera']),
('art', ['art', 'rat', 'tar', 'tra']),
('article', ['article', 'recital']),
('articles', ['altrices', 'selictar']),
('arts', ['sart', 'star', 'stra', 'tars', 'tsar']),
('arty', ['arty', 'atry', 'tray']),
('ash', ['ash', 'sah', 'sha']),
('aside', ['aside']),
('aspired', ['despair', 'pardesi']),
('asps', ['pass']),
('ate', ['ate', 'eat', 'eta', 'tae', 'tea']),
('ates', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),
('atoners', ['noreast', 'rosetan', 'seatron', 'senator', 'treason']),
('attic', ['attic', 'tacit']),
('aves', ['save', 'vase']),
('aye', ['aye', 'yea']),
('backward', ['backward', 'drawback']),
('bad', ['bad', 'dab']),
('bag', ['bag', 'gab']),
('bake', ['bake', 'beak']),
('baker', ['baker', 'brake', 'break']),
('balm', ['balm', 'lamb']),
('bar', ['bar', 'bra', 'rab']),
('bare', ['bare', 'bear', 'brae']),
('bast', ['bast', 'bats', 'stab']),
('bat', ['bat', 'tab']),
('batlet', ['battel', 'battle', 'tablet']),
('bats', ['bast', 'bats', 'stab']),
('battel', ['battel', 'battle', 'tablet']),
('battle', ['battel', 'battle', 'tablet']),
('beak', ['bake', 'beak']),
('bear', ['bare', 'bear', 'brae']),
('begin', ['begin', 'being', 'binge']),
('being', ['begin', 'being', 'binge']),
('below', ['below', 'bowel', 'elbow']),
('best', ['best']),
('bets', ['best']),
('binge', ['begin', 'being', 'binge']),
('blam', ['balm', 'lamb']),
('blot', ['blot', 'bolt']),
('blow', ['blow', 'bowl']),
('bludier', ['builder', 'rebuild']),
('bluest', ['bustle', 'sublet', 'subtle']),
('bluets', ['bustle', 'sublet', 'subtle']),
('bolt', ['blot', 'bolt']),
('bombed', ['bombed']),
('borde', ['boder', 'orbed']),
('bored', ['boder', 'orbed']),
('bores', ['boser', 'brose', 'sober']),
('boss', ['boss']),
('bourne', ['unrobe']),
('bowel', ['below', 'bowel', 'elbow']),
('bowl', ['blow', 'bowl']),
('bra', ['bar', 'bra', 'rab']),
('brae', ['bare', 'bear', 'brae']),
('brag', ['brag', 'garb', 'grab']),
('brake', ['baker', 'brake', 'break']),
('braved', ['adverb']),
('break', ['baker', 'brake', 'break']),
('brief', ['bifer', 'brief', 'fiber']),
('brose', ['boser', 'brose', 'sober']),
('brush', ['brush', 'shrub']),
('buhrs', ['brush', 'shrub']),
('builder', ['builder', 'rebuild']),
('burden', ['bunder', 'burden', 'burned', 'unbred']),
('burned', ['bunder', 'burden', 'burned', 'unbred']),
('bury', ['bury', 'ruby']),
('bush', ['bush']),
('bust', ['bust', 'stub']),
('bustle', ['bustle', 'sublet', 'subtle']),
('but', ['but', 'tub']),
('butles', ['bustle', 'sublet', 'subtle']),
('buts', ['bust', 'stub']),
('cab', ['bac', 'cab']),
('cabs', ['scab']),
('cadres', ['sacred']),
('cafe', ['face']),
('caller', ['caller', 'cellar', 'recall']),
('calm', ['calm', 'clam']),
('calo', ['alco', 'coal', 'cola', 'loca']),
('came', ['acme', 'came', 'mace']),
('caned', ['dance', 'decan']),
('canoe', ['acone', 'canoe', 'ocean']),
('cans', ['scan']),
('cape', ['cape', 'cepa', 'pace']),
('car', ['arc', 'car']),
('care', ['acre', 'care', 'crea', 'race']),
('cares', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('caret',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('carol', ['calor', 'carol', 'claro', 'coral']),
('carp', ['carp', 'crap']),
('cars', ['scar']),
('carse', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('carte',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('case', ['case', 'esca']),
('cask', ['cask', 'sack']),
('cast', ['cast', 'scat']),
('cat', ['act', 'cat']),
('cater',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('cats', ['cast', 'scat']),
('cause', ['cause', 'sauce']),
('causes', ['causse']),
('ceas', ['case', 'esca']),
('cedars', ['sacred']),
('cedi', ['dice', 'iced']),
('cellar', ['caller', 'cellar', 'recall']),
('cents', ['scent']),
('cereus', ['ceruse', 'recuse', 'rescue', 'secure']),
('ceruse', ['ceruse', 'recuse', 'rescue', 'secure']),
('cesure', ['ceruse', 'recuse', 'rescue', 'secure']),
('charm', ['charm', 'march']),
('charmer', ['charmer', 'marcher', 'remarch']),
('charming', ['charming']),
('chase', ['chase']),
('cheating', ['cheating', 'teaching']),
('chetnik', ['kitchen', 'thicken']),
('chin', ['chin', 'inch']),
('chit', ['chit', 'itch']),
('chum', ['chum', 'much']),
('cion', ['cion', 'coin', 'icon']),
('citrus', ['citrus', 'rictus', 'rustic']),
('clam', ['calm', 'clam']),
('claro', ['calor', 'carol', 'claro', 'coral']),
('clay', ['acyl', 'clay', 'lacy']),
('cloud', ['cloud', 'could']),
('coal', ['alco', 'coal', 'cola', 'loca']),
('cocaine', ['cocaine', 'oceanic']),
('cod', ['cod', 'doc']),
('coin', ['cion', 'coin', 'icon']),
('cola', ['alco', 'coal', 'cola', 'loca']),
('comics', ['cosmic']),
('cone', ['cone', 'once']),
('coni', ['cion', 'coin', 'icon']),
('cool', ['cool', 'loco']),
('coral', ['calor', 'carol', 'claro', 'coral']),
('cork', ['cork', 'rock']),
('corset', ['corset', 'coster', 'escort', 'scoter', 'sector']),
('corvet', ['covert', 'vector']),
('cosmic', ['cosmic']),
('coster', ['corset', 'coster', 'escort', 'scoter', 'sector']),
('could', ['cloud', 'could']),
('covert', ['covert', 'vector']),
('crap', ['carp', 'crap']),
('crate',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('crews', ['screw']),
('dab', ['bad', 'dab']),
('dad', ['add', 'dad']),
('dah', ['dah', 'dha', 'had']),
('dairy', ['dairy', 'diary', 'yaird']),
('dale', ['dale', 'deal', 'lade', 'lead']),
('dalets', ['desalt', 'salted']),
('dali', ['dali', 'dial', 'laid']),
('dam', ['dam', 'mad']),
('dance', ['dance', 'decan']),
('dare', ['ared', 'daer', 'dare', 'dear', 'read']),
('dashed', ['dashed', 'shaded']),
('dawn', ['dawn', 'wand']),
('deaf', ['deaf', 'fade']),
('deal', ['dale', 'deal', 'lade', 'lead']),
('dealer', ['dealer', 'leader', 'redeal', 'relade', 'relead']),
('dear', ['ared', 'daer', 'dare', 'dear', 'read']),
('dearer', ['reader', 'redare', 'reread']),
('death', ['death']),
('deaws', ['sawed']),
('declines', ['licensed', 'silenced']),
('decree', ['decree', 'recede']),
('deens', ['dense', 'needs']),
('defer', ['defer', 'freed']),
('deil', ['idle', 'lied']),
('delayer', ['delayer', 'layered', 'redelay']),
('deli', ['idle', 'lied']),
('deltas', ['desalt', 'salted']),
('denes', ['dense', 'needs']),
('dense', ['dense', 'needs']),
('denser', ['resend', 'sender']),
('desalt', ['desalt', 'salted']),
('deserver', ['deserver', 'reserved', 'reversed']),
('despair', ['despair', 'pardesi']),
('devote', ['devote']),
('dew', ['dew', 'wed']),
('dial', ['dali', 'dial', 'laid']),
('diaper', ['diaper', 'paired']),
('diapers', ['despair', 'pardesi']),
('diary', ['dairy', 'diary', 'yaird']),
('dice', ['dice', 'iced']),
('diel', ['idle', 'lied']),
('diet', ['diet', 'dite', 'edit', 'tide', 'tied']),
('dikes', ['skied']),
('dimple', ['dimple']),
('direr', ['drier', 'rider']),
('disease', ['disease', 'seaside']),
('disk', ['disk', 'skid']),
('dite', ['diet', 'dite', 'edit', 'tide', 'tied']),
('doc', ['cod', 'doc']),
('doen', ['done', 'node']),
('dog', ['dog', 'god']),
('dogs', ['dogs']),
('don', ['don', 'nod']),
('done', ['done', 'node']),
('doom', ['doom', 'mood']),
('dozen', ['dozen', 'zoned']),
('draw', ['draw', 'ward']),
('drawback', ['backward', 'drawback']),
('dreare', ['reader', 'redare', 'reread']),
('drier', ['drier', 'rider']),
('dune', ['dune', 'nude', 'unde']),
('dunite', ['dunite', 'united', 'untied']),
('dusty', ['dusty', 'study']),
('eager', ['agree', 'eager', 'eagre']),
('eagers', ['grease']),
('eagre', ['agree', 'eager', 'eagre']),
('eagres', ['grease']),
('ear', ['aer', 'are', 'ear', 'era', 'rea']),
('eard', ['ared', 'daer', 'dare', 'dear', 'read']),
('early', ['early', 'layer', 'relay']),
('earn', ['earn', 'near', 'rane']),
('earner', ['earner']),
('ears', ['arse', 'rase', 'sare', 'sear', 'sera']),
('earthy', ['earthy', 'hearty', 'yearth']),
('east', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),
('eastling', ['genitals', 'stealing']),
('eat', ['ate', 'eat', 'eta', 'tae', 'tea']),
('eath', ['haet', 'hate', 'heat']),
('eats', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),
('edit', ['diet', 'dite', 'edit', 'tide', 'tied']),
('eel', ['eel', 'lee']),
('egos', ['goes', 'sego']),
('eh', ['eh', 'he']),
('eild', ['idle', 'lied']),
('elbow', ['below', 'bowel', 'elbow']),
('elints', ['enlist', 'listen', 'silent', 'tinsel']),
('emit', ['emit', 'item', 'mite', 'time']),
('emits', ['metis', 'smite', 'stime', 'times']),
('emoter', ['meteor', 'remote']),
('enders', ['resend', 'sender']),
('enfiring', ['infringe', 'refining']),
('enlist', ['enlist', 'listen', 'silent', 'tinsel']),
('enlisted', ['enlisted', 'lintseed']),
('era', ['aer', 'are', 'ear', 'era', 'rea']),
('eras', ['arse', 'rase', 'sare', 'sear', 'sera']),
('eros', ['eros', 'rose', 'sero', 'sore']),
('escar', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('escort', ['corset', 'coster', 'escort', 'scoter', 'sector']),
('ester',
['ester',
'estre',
'reest',
'reset',
'steer',
'stere',
'stree',
'terse',
'tsere']),
('eta', ['ate', 'eat', 'eta', 'tae', 'tea']),
('etas', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),
('ether', ['ether', 'rethe', 'theer', 'there', 'three']),
('evil', ['evil', 'live', 'veil', 'vile', 'vlei']),
('evils', ['slive']),
('ewts', ['stew', 'west']),
('except', ['except', 'expect']),
('exist', ['exist', 'sixte']),
('exits', ['exist', 'sixte']),
('expect', ['except', 'expect']),
('face', ['face']),
('fade', ['deaf', 'fade']),
('failed', ['afield', 'defial']),
('faker', ['faker', 'freak']),
('fare', ['fare', 'fear', 'frae']),
('farmed', ['framed']),
('farming', ['farming', 'framing']),
('fast', ['fast', 'saft']),
('fat', ['aft', 'fat']),
('fate', ['atef', 'fate', 'feat']),
('fats', ['fast', 'saft']),
('fear', ['fare', 'fear', 'frae']),
('feat', ['atef', 'fate', 'feat']),
('feel', ['feel', 'flee']),
('feer', ['feer', 'free', 'reef']),
('felid', ['felid', 'field']),
('felt', ['felt', 'flet', 'left']),
('fere', ['feer', 'free', 'reef']),
('feta', ['atef', 'fate', 'feat']),
('fiber', ['bifer', 'brief', 'fiber']),
('fibre', ['bifer', 'brief', 'fiber']),
('field', ['felid', 'field']),
('filed', ['felid', 'field']),
('filer', ['filer', 'flier', 'lifer', 'rifle']),
('filets', ['itself', 'stifle']),
('filler', ['filler', 'refill']),
('finder', ['finder', 'friend', 'redfin', 'refind']),
('finer', ['finer', 'infer']),
('finger', ['finger', 'fringe']),
('fired', ['fired', 'fried']),
('fires', ['serif']),
('fist', ['fist', 'sift']),
('fitness', ['fitness']),
('fits', ['fist', 'sift']),
('flee', ['feel', 'flee']),
('flesh', ['flesh', 'shelf']),
('flied', ['felid', 'field']),
('flier', ['filer', 'flier', 'lifer', 'rifle']),
('fliest', ['itself', 'stifle']),
('flites', ['itself', 'stifle']),
('flog', ['flog', 'golf']),
('flow', ['flow', 'fowl', 'wolf']),
('flue', ['flue', 'fuel']),
('form', ['form', 'from']),
('former', ['former', 'reform']),
('forth', ['forth', 'froth']),
('fowl', ['flow', 'fowl', 'wolf']),
('frae', ['fare', 'fear', 'frae']),
('framed', ['framed']),
('framing', ['farming', 'framing']),
('freak', ['faker', 'freak']),
('free', ['feer', 'free', 'reef']),
('freed', ['defer', 'freed']),
('fried', ['fired', 'fried']),
('friend', ['finder', 'friend', 'redfin', 'refind']),
('fries', ['serif']),
('fringe', ['finger', 'fringe']),
('frise', ['serif']),
('from', ['form', 'from']),
('froth', ['forth', 'froth']),
('fuel', ['flue', 'fuel']),
('furs', ['surf']),
('gab', ['bag', 'gab']),
('gals', ['slag']),
('gaps', ['gasp']),
('garb', ['brag', 'garb', 'grab']),
('gas', ['gas', 'sag']),
('gasp', ['gasp']),
('gater', ['gater', 'grate', 'great', 'retag', 'targe']),
('geare', ['agree', 'eager', 'eagre']),
('geares', ['grease']),
('gel', ['gel', 'leg']),
('gelatins', ['genitals', 'stealing']),
('genitals', ['genitals', 'stealing']),
('geos', ['goes', 'sego']),
('girn', ['girn', 'grin', 'ring']),
('glare', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),
('god', ['dog', 'god']),
('gods', ['dogs']),
('goes', ['goes', 'sego']),
('golf', ['flog', 'golf']),
('grab', ['brag', 'garb', 'grab']),
('grate', ['gater', 'grate', 'great', 'retag', 'targe']),
('grease', ['grease']),
('great', ['gater', 'grate', 'great', 'retag', 'targe']),
('grin', ['girn', 'grin', 'ring']),
('grues', ['surge']),
('gulp', ['gulp', 'plug']),
('gum', ['gum', 'mug']),
('gunshot', ['gunshot', 'shotgun', 'uhtsong']),
('gust', ['gust', 'stug']),
('guts', ['gust', 'stug']),
('ha', ['ah', 'ha']),
('had', ['dah', 'dha', 'had']),
('haet', ['haet', 'hate', 'heat']),
('halls', ['shall']),
('halses', ['hassel', 'hassle']),
('hams', ['mash', 'samh', 'sham']),
('hangover', ['overhang']),
('harps', ['sharp', 'shrap']),
('has', ['ash', 'sah', 'sha']),
('hassel', ['hassel', 'hassle']),
('hassle', ['hassel', 'hassle']),
('hate', ['haet', 'hate', 'heat']),
('hated', ['death']),
('hay', ['hay', 'yah']),
('he', ['eh', 'he']),
('hearty', ['earthy', 'hearty', 'yearth']),
('heat', ['haet', 'hate', 'heat']),
('heater', ['heater', 'hereat', 'reheat']),
('heaters', ['thereas']),
('heir', ['heir', 'hire']),
('heirs', ['hirse', 'shier', 'shire']),
('hereat', ['heater', 'hereat', 'reheat']),
('hewn', ['hewn', 'when']),
('hikes', ['sheik']),
('hire', ['heir', 'hire']),
('hires', ['hirse', 'shier', 'shire']),
('ho', ['ho', 'oh']),
('hocks', ['shock']),
('hoes', ['hose', 'shoe']),
('hognuts', ['gunshot', 'shotgun', 'uhtsong']),
('hooks', ['shook']),
('hose', ['hose', 'shoe']),
('host', ['host', 'shot', 'tosh']),
('hots', ['host', 'shot', 'tosh']),
('houts', ['shout', 'south']),
('how', ['how', 'who']),
('howres', ['shower']),
('hubs', ['bush']),
('hug', ['hug', 'ugh']),
('hums', ['mush']),
('hustle', ['hustle', 'sleuth']),
('hustling', ['sunlight']),
('huts', ['shut', 'thus', 'tush']),
('iced', ['dice', 'iced']),
('icon', ['cion', 'coin', 'icon']),
('idea', ['aide', 'idea']),
('ideas', ['aside']),
('idle', ['idle', 'lied']),
('impart', ['armpit', 'impart']),
('impled', ['dimple']),
('imprints', ['misprint']),
('incest', ['encist', 'incest', 'insect', 'scient']),
('inch', ['chin', 'inch']),
('infer', ['finer', 'infer']),
('infests', ['fitness']),
('infringe', ['infringe', 'refining']),
('ink', ['ink', 'kin']),
('inks', ['inks', 'sink', 'skin']),
('inlets', ['enlist', 'listen', 'silent', 'tinsel']),
('ins', ['sin']),
('insect', ['encist', 'incest', 'insect', 'scient']),
('instar', ['instar', 'santir', 'strain']),
('insult', ['insult', 'sunlit', 'unlist', 'unslit']),
('itch', ['chit', 'itch']),
('item', ['emit', 'item', 'mite', 'time']),
('items', ['metis', 'smite', 'stime', 'times']),
('its', ['ist', 'its', 'sit']),
('itself', ['itself', 'stifle']),
('jest', ['jest']),
('jets', ['jest']),
('joiner', ['joiner', 'rejoin']),
('just', ['just']),
('juts', ['just']),
('kale', ['kale', 'lake', 'leak']),
('kebar', ['baker', 'brake', 'break']),
('keel', ['keel', 'kele', 'leek']),
('keels', ['skeel', 'sleek']),
('keen', ['keen', 'knee']),
('kids', ['disk', 'skid']),
('kills', ['skill']),
('kiln', ['kiln', 'link']),
('kin', ['ink', 'kin']),
('kins', ['inks', 'sink', 'skin']),
('kiss', ['kiss']),
('kisser', ['kisser', 'rekiss']),
('kitchen', ['kitchen', 'thicken']),
('knee', ['keen', 'knee']),
('koas', ['asok', 'soak', 'soka']),
('krises', ['kisser', 'rekiss']),
('lacy', ['acyl', 'clay', 'lacy']),
('lade', ['dale', 'deal', 'lade', 'lead']),
('laered', ['dealer', 'leader', 'redeal', 'relade', 'relead']),
('lager', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),
('lags', ['slag']),
('laid', ['dali', 'dial', 'laid']),
('lair', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('lake', ['kale', 'lake', 'leak']),
('lamb', ['balm', 'lamb']),
('lameness', ['lameness', 'maleness', 'maneless', 'nameless']),
('lames', ['amsel', 'mesal', 'samel']),
('lamp', ['lamp', 'palm']),
('lap', ['alp', 'lap', 'pal']),
('lapins', ['spinal']),
('laps', ['salp', 'slap']),
('lapse', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('large', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),
('lari', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('lases', ['salse']),
('lashes', ['hassel', 'hassle']),
('last', ['last', 'salt', 'slat']),
('lasted', ['desalt', 'salted']),
('lasting', ['lasting', 'salting', 'slating', 'staling']),
('late', ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal']),
('lats', ['last', 'salt', 'slat']),
('layer', ['early', 'layer', 'relay']),
('layered', ['delayer', 'layered', 'redelay']),
('layers', ['reslay', 'slayer']),
('laymen', ['meanly', 'namely']),
('layover', ['layover', 'overlay']),
('lays', ['slay']),
('lead', ['dale', 'deal', 'lade', 'lead']),
('leader', ['dealer', 'leader', 'redeal', 'relade', 'relead']),
('leak', ['kale', 'lake', 'leak']),
('leams', ['amsel', 'mesal', 'samel']),
('leap', ['leap', 'lepa', 'pale', 'peal', 'plea']),
('leaps', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('leared', ['dealer', 'leader', 'redeal', 'relade', 'relead']),
('learnt', ['altern', 'antler', 'learnt', 'rental', 'ternal']),
('leary', ['early', 'layer', 'relay']),
('leat', ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal']),
('lee', ['eel', 'lee']),
('leek', ['keel', 'kele', 'leek']),
('leeks', ['skeel', 'sleek']),
('left', ['felt', 'flet', 'left']),
('leg', ['gel', 'leg']),
('leke', ['keel', 'kele', 'leek']),
('lemon', ['lemon', 'melon', 'monel']),
('leper', ['leper', 'perle', 'repel']),
('lessened', ['needless', 'seldseen']),
('lessons', ['sonless']),
('levis', ['slive']),
('liar', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('license', ['license', 'selenic', 'silence']),
('licensed', ['licensed', 'silenced']),
('licks', ['slick']),
('lied', ['idle', 'lied']),
('lifer', ['filer', 'flier', 'lifer', 'rifle']),
('lime', ['lime', 'mile']),
('limes', ['limes', 'slime', 'smile']),
('limped', ['dimple']),
('link', ['kiln', 'link']),
('lino', ['lino', 'lion', 'loin', 'noil']),
('lintseed', ['enlisted', 'lintseed']),
('lion', ['lino', 'lion', 'loin', 'noil']),
('lippers', ['slipper']),
('lips', ['lisp', 'slip']),
('lira', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('lisp', ['lisp', 'slip']),
('list', ['list', 'silt', 'slit']),
('listen', ['enlist', 'listen', 'silent', 'tinsel']),
('listened', ['enlisted', 'lintseed']),
('listing', ['listing', 'silting']),
('lits', ['list', 'silt', 'slit']),
('live', ['evil', 'live', 'veil', 'vile', 'vlei']),
('lives', ['slive']),
('loca', ['alco', 'coal', 'cola', 'loca']),
('loco', ['cool', 'loco']),
('loin', ['lino', 'lion', 'loin', 'noil']),
('lookout', ['lookout', 'outlook']),
('looped', ['poodle']),
('loops', ['polos', 'sloop', 'spool']),
('loot', ['loot', 'tool']),
('lose', ['lose', 'sloe', 'sole']),
('lost', ['lost', 'lots', 'slot']),
('loto', ['loot', 'tool']),
('lots', ['lost', 'lots', 'slot']),
('loyal', ['alloy', 'loyal']),
('lump', ['lump', 'plum']),
('lure', ['lure', 'rule']),
('lured', ['duler', 'urled']),
('lures', ['sluer']),
('luring', ['ruling', 'urling']),
('ma', ['am', 'ma']),
('mace', ['acme', 'came', 'mace']),
('mad', ['dam', 'mad']),
('mainer', ['marine', 'remain']),
('maleness', ['lameness', 'maleness', 'maneless', 'nameless']),
('males', ['amsel', 'mesal', 'samel']),
('mane', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),
('maneless', ['lameness', 'maleness', 'maneless', 'nameless']),
('manors', ['ramson', 'ransom']),
('manures', ['surname']),
('map', ['amp', 'map', 'pam']),
('maples', ['sample']),
('maps', ['samp', 'spam']),
('mar', ['arm', 'mar', 'ram']),
('march', ['charm', 'march']),
('marcher', ['charmer', 'marcher', 'remarch']),
('marching', ['charming']),
('mare', ['mare', 'rame', 'ream']),
('marine', ['marine', 'remain']),
('marital', ['marital', 'martial']),
('marons', ['ramson', 'ransom']),
('mars', ['arms']),
('martial', ['marital', 'martial']),
('marts', ['smart', 'stram']),
('mash', ['mash', 'samh', 'sham']),
('mast', ['mast', 'stam']),
('mate', ['mate', 'meat', 'meta', 'tame', 'team']),
('mated', ['metad']),
('mates', ['steam', 'stema']),
('mating', ['mating']),
('mats', ['mast', 'stam']),
('meals', ['amsel', 'mesal', 'samel']),
('mean', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),
('meanly', ['meanly', 'namely']),
('meat', ['mate', 'meat', 'meta', 'tame', 'team']),
('meats', ['steam', 'stema']),
('melas', ['amsel', 'mesal', 'samel']),
('melon', ['lemon', 'melon', 'monel']),
('melts', ['smelt']),
('mesal', ['amsel', 'mesal', 'samel']),
('meta', ['mate', 'meat', 'meta', 'tame', 'team']),
('meteor', ['meteor', 'remote']),
('metis', ['metis', 'smite', 'stime', 'times']),
('metols', ['molest']),
('mile', ['lime', 'mile']),
('miles', ['limes', 'slime', 'smile']),
('misprint', ['misprint']),
('mite', ['emit', 'item', 'mite', 'time']),
('mites', ['metis', 'smite', 'stime', 'times']),
('mobbed', ['bombed']),
('moist', ['moist']),
('moits', ['moist']),
('molest', ['molest']),
('mono', ['mono', 'moon']),
('mood', ['doom', 'mood']),
('moon', ['mono', 'moon']),
('moor', ['moor', 'moro', 'room']),
('motels', ['molest']),
('much', ['chum', 'much']),
('mug', ['gum', 'mug']),
('murenas', ['surname']),
('mush', ['mush']),
('mutilate', ['mutilate', 'ultimate']),
('nags', ['sang', 'snag']),
('nails', ['sinal', 'slain', 'snail']),
('name', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),
('nameless', ['lameness', 'maleness', 'maneless', 'nameless']),
('namely', ['meanly', 'namely']),
('nap', ['nap', 'pan']),
('nare', ['earn', 'near', 'rane']),
('nat', ['ant', 'nat', 'tan']),
('nay', ['any', 'nay', 'yan']),
('near', ['earn', 'near', 'rane']),
('nearer', ['earner']),
('needless', ['needless', 'seldseen']),
('needs', ['dense', 'needs']),
('nema', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),
('neon', ['neon', 'none']),
('nest', ['nest', 'sent', 'sten']),
('net', ['net', 'ten']),
('nets', ['nest', 'sent', 'sten']),
('nevi', ['vein', 'vine']),
('nicest', ['encist', 'incest', 'insect', 'scient']),
('night', ['night', 'thing']),
('nights', ['nights']),
('nip', ['nip', 'pin']),
('nips', ['snip', 'spin']),
('nis', ['sin']),
('no', ['no', 'on']),
('nod', ['don', 'nod']),
('node', ['done', 'node']),
('noil', ['lino', 'lion', 'loin', 'noil']),
('none', ['neon', 'none']),
('normas', ['ramson', 'ransom']),
('not', ['not', 'ton']),
('note', ['note', 'tone']),
('noted', ['noted', 'toned']),
('noteless', ['noteless', 'toneless']),
('notices', ['contise', 'noetics', 'section']),
('noughts', ['gunshot', 'shotgun', 'uhtsong']),
('now', ['now', 'own', 'won']),
('nows', ['snow', 'sown']),
('nude', ['dune', 'nude', 'unde']),
('nudity', ['nudity', 'untidy']),
('nur', ['run', 'urn']),
('nurs', ['snur']),
('oaks', ['asok', 'soak', 'soka']),
('ocean', ['acone', 'canoe', 'ocean']),
('oceanic', ['cocaine', 'oceanic']),
('oh', ['ho', 'oh']),
('oils', ['silo', 'siol', 'soil', 'soli']),
('okas', ['asok', 'soak', 'soka']),
('oles', ['lose', 'sloe', 'sole']),
('omits', ['moist']),
('on', ['no', 'on']),
('once', ['cone', 'once']),
('opener', ['opener', 'reopen', 'repone']),
('opt', ['opt', 'pot', 'top']),
('option', ['option', 'potion']),
('opts', ['post', 'spot', 'stop', 'tops']),
('orbed', ['boder', 'orbed']),
('ores', ['eros', 'rose', 'sero', 'sore']),
('organist', ['orangist', 'organist', 'roasting', 'signator']),
('oriental', ['oriental', 'relation']),
('ought', ['ought', 'tough']),
('oughts', ['sought']),
('ours', ['ours', 'sour']),
('outlook', ['lookout', 'outlook']),
('overhang', ['overhang']),
('overlay', ['layover', 'overlay']),
('own', ['now', 'own', 'won']),
('owns', ['snow', 'sown']),
('owt', ['tow', 'two', 'wot']),
('pace', ['cape', 'cepa', 'pace']),
('packer', ['packer', 'repack']),
('padle', ['padle', 'paled', 'pedal', 'plead']),
('painter', ['painter', 'pertain', 'repaint']),
('paired', ['diaper', 'paired']),
('pal', ['alp', 'lap', 'pal']),
('pale', ['leap', 'lepa', 'pale', 'peal', 'plea']),
('paled', ['padle', 'paled', 'pedal', 'plead']),
('pales', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('palest', ['pastel', 'septal', 'staple']),
('palets', ['pastel', 'septal', 'staple']),
('palm', ['lamp', 'palm']),
('pals', ['salp', 'slap']),
('pam', ['amp', 'map', 'pam']),
('pams', ['samp', 'spam']),
('pan', ['nap', 'pan']),
('panel', ['panel', 'penal', 'plane']),
('pardie', ['diaper', 'paired']),
('pare', ['aper', 'pare', 'pear', 'rape', 'reap']),
('parks', ['spark']),
('partim', ['armpit', 'impart']),
('parts', ['spart', 'sprat', 'strap', 'traps']),
('pass', ['pass']),
('pastel', ['pastel', 'septal', 'staple']),
('pat', ['apt', 'pat', 'tap']),
('pate', ['pate', 'peat', 'tape', 'teap']),
('pay', ['pay', 'pya', 'yap']),
('pea', ['ape', 'pea']),
('peaks', ['sapek', 'speak']),
('peal', ['leap', 'lepa', 'pale', 'peal', 'plea']),
('peals', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('pear', ['aper', 'pare', 'pear', 'rape', 'reap']),
('peat', ['pate', 'peat', 'tape', 'teap']),
('pedal', ['padle', 'paled', 'pedal', 'plead']),
('pela', ['leap', 'lepa', 'pale', 'peal', 'plea']),
('pelas', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('pelmas', ['sample']),
('peltas', ['pastel', 'septal', 'staple']),
('pelts', ['slept', 'spelt', 'splet']),
('penal', ['panel', 'penal', 'plane']),
('penster', ['penster', 'present', 'serpent', 'strepen']),
('per', ['per', 'rep']),
('pereon', ['opener', 'reopen', 'repone']),
('peri', ['peri', 'pier', 'ripe']),
('perone', ['opener', 'reopen', 'repone']),
('pertain', ['painter', 'pertain', 'repaint']),
('pest', ['pest', 'sept', 'spet', 'step']),
('petals', ['pastel', 'septal', 'staple']),
('pets', ['pest', 'sept', 'spet', 'step']),
('pier', ['peri', 'pier', 'ripe']),
('pills', ['spill']),
('pin', ['nip', 'pin']),
('pinots', ['piston']),
('pins', ['snip', 'spin']),
('pintos', ['piston']),
('piston', ['piston']),
('pit', ['pit', 'tip']),
('pitons', ['piston']),
('pits', ['pist', 'spit']),
('plains', ['spinal']),
('plane', ['panel', 'penal', 'plane']),
('plaste', ['pastel', 'septal', 'staple']),
('plates', ['pastel', 'septal', 'staple']),
('plea', ['leap', 'lepa', 'pale', 'peal', 'plea']),
('plead', ['padle', 'paled', 'pedal', 'plead']),
('pleas', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('pleats', ['pastel', 'septal', 'staple']),
('plena', ['panel', 'penal', 'plane']),
('plug', ['gulp', 'plug']),
('plum', ['lump', 'plum']),
('points', ['piston']),
('polos', ['polos', 'sloop', 'spool']),
('poodle', ['poodle']),
('pooled', ['poodle']),
('pools', ['polos', 'sloop', 'spool']),
('pore', ['pore', 'rope']),
('pores', ['poser', 'prose', 'ropes', 'spore']),
('ports', ['sport', 'strop']),
('poser', ['poser', 'prose', 'ropes', 'spore']),
('post', ['post', 'spot', 'stop', 'tops']),
('postin', ['piston']),
('postman', ['postman', 'topsman']),
('pot', ['opt', 'pot', 'top']),
('potins', ['piston']),
('potion', ['option', 'potion']),
('pots', ['post', 'spot', 'stop', 'tops']),
('praised', ['despair', 'pardesi']),
('prats', ['spart', 'sprat', 'strap', 'traps']),
('prays', ['raspy', 'spary', 'spray']),
('pre', ['per', 'rep']),
('present', ['penster', 'present', 'serpent', 'strepen']),
('printer', ['printer', 'reprint']),
('pronto', ['pronto', 'proton']),
('prose', ['poser', 'prose', 'ropes', 'spore']),
('prost', ['sport', 'strop']),
('proton', ['pronto', 'proton']),
('pya', ['pay', 'pya', 'yap']),
('quiet', ['quiet', 'quite']),
('quite', ['quiet', 'quite']),
('race', ['acre', 'care', 'crea', 'race']),
('races', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('racket', ['racket', 'retack', 'tacker']),
('rade', ['ared', 'daer', 'dare', 'dear', 'read']),
('ragee', ['agree', 'eager', 'eagre']),
('ragees', ['grease']),
('raginis', ['raising']),
('rail', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('raising', ['raising']),
('ram', ['arm', 'mar', 'ram']),
('rams', ['arms']),
('ramson', ['ramson', 'ransom']),
('ransom', ['ramson', 'ransom']),
('rape', ['aper', 'pare', 'pear', 'rape', 'reap']),
('rare', ['rare', 'rear']),
('rase', ['arse', 'rase', 'sare', 'sear', 'sera']),
('raspy', ['raspy', 'spary', 'spray']),
('rast', ['sart', 'star', 'stra', 'tars', 'tsar']),
('rat', ['art', 'rat', 'tar', 'tra']),
('rats', ['sart', 'star', 'stra', 'tars', 'tsar']),
('raw', ['raw', 'war']),
('rayle', ['early', 'layer', 'relay']),
('rayles', ['reslay', 'slayer']),
('react',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('read', ['ared', 'daer', 'dare', 'dear', 'read']),
('reader', ['reader', 'redare', 'reread']),
('realist', ['realist', 'saltier']),
('ream', ['mare', 'rame', 'ream']),
('rean', ['earn', 'near', 'rane']),
('reap', ['aper', 'pare', 'pear', 'rape', 'reap']),
('rear', ['rare', 'rear']),
('reared', ['reader', 'redare', 'reread']),
('rebuild', ['builder', 'rebuild']),
('recall', ['caller', 'cellar', 'recall']),
('recede', ['decree', 'recede']),
('recital', ['article', 'recital']),
('recitals', ['altrices', 'selictar']),
('recta',
['caret',
'carte',
'cater',
'crate',
'creat',
'creta',
'react',
'recta',
'trace']),
('rectos', ['corset', 'coster', 'escort', 'scoter', 'sector']),
('recuse', ['ceruse', 'recuse', 'rescue', 'secure']),
('recused', ['seducer']),
('redeal', ['dealer', 'leader', 'redeal', 'relade', 'relead']),
('redear', ['reader', 'redare', 'reread']),
('redfin', ['finder', 'friend', 'redfin', 'refind']),
('reduces', ['seducer']),
('reearn', ['earner']),
('reef', ['feer', 'free', 'reef']),
('reest',
['ester',
'estre',
'reest',
'reset',
'steer',
'stere',
'stree',
'terse',
'tsere']),
('refed', ['defer', 'freed']),
('refill', ['filler', 'refill']),
('refind', ['finder', 'friend', 'redfin', 'refind']),
('refining', ['infringe', 'refining']),
('reform', ['former', 'reform']),
('regal', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),
('reheat', ['heater', 'hereat', 'reheat']),
('reheats', ['thereas']),
('reifs', ['serif']),
('reins', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),
('reird', ['drier', 'rider']),
('reists', ['resist', 'restis', 'sister']),
('rejoin', ['joiner', 'rejoin']),
('relation', ['oriental', 'relation']),
('relay', ['early', 'layer', 'relay']),
('relayed', ['delayer', 'layered', 'redelay']),
('relays', ['reslay', 'slayer']),
('remain', ['marine', 'remain']),
('remote', ['meteor', 'remote']),
('rental', ['altern', 'antler', 'learnt', 'rental', 'ternal']),
('rentals', ['saltern', 'starnel', 'sternal']),
('reopen', ['opener', 'reopen', 'repone']),
('rep', ['per', 'rep']),
('repack', ['packer', 'repack']),
('repaid', ['diaper', 'paired']),
('repaint', ['painter', 'pertain', 'repaint']),
('repel', ['leper', 'perle', 'repel']),
('repents', ['penster', 'present', 'serpent', 'strepen']),
('repins', ['respin', 'sniper']),
('repo', ['pore', 'rope']),
('repone', ['opener', 'reopen', 'repone']),
('repos', ['poser', 'prose', 'ropes', 'spore']),
('reprint', ['printer', 'reprint']),
('reread', ['reader', 'redare', 'reread']),
('rescue', ['ceruse', 'recuse', 'rescue', 'secure']),
('rescued', ['seducer']),
('resell', ['resell', 'seller']),
('resend', ['resend', 'sender']),
('reserve', ['reserve', 'resever', 'reverse', 'severer']),
('reserved', ['deserver', 'reserved', 'reversed']),
('reset',
['ester',
'estre',
'reest',
'reset',
'steer',
'stere',
'stree',
'terse',
'tsere']),
('reshow', ['shower']),
('resin', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),
('resist', ['resist', 'restis', 'sister']),
('resits', ['resist', 'restis', 'sister']),
('retack', ['racket', 'retack', 'tacker']),
('retag', ['gater', 'grate', 'great', 'retag', 'targe']),
('retails', ['realist', 'saltier']),
('retes',
['ester',
'estre',
'reest',
'reset',
'steer',
'stere',
'stree',
'terse',
'tsere']),
('rethink', ['rethink', 'thinker']),
('retrain', ['arterin', 'retrain', 'terrain', 'trainer']),
('retund', ['runted', 'tunder', 'turned']),
('reveres', ['reserve', 'resever', 'reverse', 'severer']),
('reverse', ['reserve', 'resever', 'reverse', 'severer']),
('reversed', ['deserver', 'reserved', 'reversed']),
('review', ['review', 'viewer']),
('rhies', ['hirse', 'shier', 'shire']),
('rial', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),
('rictus', ['citrus', 'rictus', 'rustic']),
('rider', ['drier', 'rider']),
('rifle', ['filer', 'flier', 'lifer', 'rifle']),
('rines', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),
('ring', ['girn', 'grin', 'ring']),
('rinse', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),
('ripe', ['peri', 'pier', 'ripe']),
('ripens', ['respin', 'sniper']),
('ripples', ['slipper']),
('risen', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),
('rite', ['iter', 'reit', 'rite', 'tier', 'tire']),
('rival', ['rival', 'viral']),
('roasting', ['orangist', 'organist', 'roasting', 'signator']),
('robed', ['boder', 'orbed']),
('robes', ['boser', 'brose', 'sober']),
('rock', ['cork', 'rock']),
('roes', ['eros', 'rose', 'sero', 'sore']),
('romans', ['ramson', 'ransom']),
('room', ['moor', 'moro', 'room']),
('rope', ['pore', 'rope']),
('ropes', ['poser', 'prose', 'ropes', 'spore']),
('rose', ['eros', 'rose', 'sero', 'sore']),
('rout', ['rout', 'toru', 'tour']),
('rowdier', ['worried']),
('ruby', ['bury', 'ruby']),
('rule', ['lure', 'rule']),
('ruled', ['duler', 'urled']),
('rules', ['sluer']),
('ruling', ['ruling', 'urling']),
('run', ['run', 'urn']),
('runs', ['snur']),
('runted', ['runted', 'tunder', 'turned']),
('runts', ['snurt', 'turns']),
('rust', ['rust']),
('rustic', ['citrus', 'rictus', 'rustic']),
('rusts', ['truss']),
('ruts', ['rust']),
('sack', ['cask', 'sack']),
('sacred', ['sacred']),
('sag', ['gas', 'sag']),
('saint', ['saint', 'satin', 'stain']),
('sairing', ['raising']),
('salep', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),
('sales', ['salse']),
('salesmen', ['lameness', 'maleness', 'maneless', 'nameless']),
('salp', ['salp', 'slap']),
('salse', ['salse']),
('salt', ['last', 'salt', 'slat']),
('salted', ['desalt', 'salted']),
('saltern', ['saltern', 'starnel', 'sternal']),
('saltier', ['realist', 'saltier']),
('salting', ['lasting', 'salting', 'slating', 'staling']),
('saltire', ['realist', 'saltier']),
('samel', ['amsel', 'mesal', 'samel']),
('samp', ['samp', 'spam']),
('sample', ['sample']),
('sang', ['sang', 'snag']),
('santir', ['instar', 'santir', 'strain']),
('saps', ['pass']),
('sate', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),
('satem', ['steam', 'stema']),
('satin', ['saint', 'satin', 'stain']),
('sauce', ['cause', 'sauce']),
('sauces', ['causse']),
('save', ['save', 'vase']),
('saw', ['saw', 'swa', 'was']),
('sawed', ['sawed']),
('scab', ['scab']),
('scan', ['scan']),
('scar', ['scar']),
('scare', ['carse', 'caser', 'ceras', 'scare', 'scrae']),
('scared', ['sacred']),
('scat', ['cast', 'scat']),
('scent', ['scent']),
...]
The complexity of this algorithm is O(M * KlogK + N), much much faster!