给定单词词典和首字母。通过在单词中连续添加一个字符,可以在字典中找到最长的单词。在任何给定的情况下,该单词在词典中应为有效单词。
例如:a-> at-> cat-> cart-> chart…。
蛮力方法是尝试使用深度优先搜索将字母添加到每个可用索引中。
因此,从“ a”开始,您可以在两个地方添加新字母。在“ a”的前面或后面,由下面的点表示。
.a.
如果添加“ t”,则现在有三个位置。
.a.t.
您可以尝试将所有26个字母添加到每个可用位置。在这种情况下,字典可以是简单的哈希表。如果在中间添加“ z”,则会得到“ azt”,它不会出现在哈希表中,因此不会在搜索中沿该路径继续。
编辑 :尼克·约翰逊的图让我很好奇所有最大路径的图是什么样子。这是一张大图(1.6 MB):
http://www.michaelfogleman.com/static/images/word_graph.png
编辑 :这是一个Python实现。暴力破解方法实际上需要一段合理的时间(几秒钟,取决于起始字母)。
import heapq letters = 'abcdefghijklmnopqrstuvwxyz' def search(words, word, path): path.append(word) yield tuple(path) for i in xrange(len(word)+1): before, after = word[:i], word[i:] for c in letters: new_word = '%s%s%s' % (before, c, after) if new_word in words: for new_path in search(words, new_word, path): yield new_path path.pop() def load(path): result = set() with open(path, 'r') as f: for line in f: word = line.lower().strip() result.add(word) return result def find_top(paths, n): gen = ((len(x), x) for x in paths) return heapq.nlargest(n, gen) if __name__ == '__main__': words = load('TWL06.txt') gen = search(words, 'b', []) top = find_top(gen, 10) for path in top: print path
当然,答案中会有很多纽带。这将打印出前N个结果,以最后一个单词的长度衡量。
使用TWL06拼字字典输出首字母’a’。
(10, ('a', 'ta', 'tap', 'tape', 'taped', 'tamped', 'stamped', 'stampede', 'stampedes', 'stampeders')) (10, ('a', 'ta', 'tap', 'tape', 'taped', 'tamped', 'stamped', 'stampede', 'stampeder', 'stampeders')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'strangle', 'strangles', 'stranglers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'strangle', 'strangler', 'stranglers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranges', 'strangles', 'stranglers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranges', 'strangers', 'stranglers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranges', 'strangers', 'estrangers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranges', 'estranges', 'estrangers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranger', 'strangler', 'stranglers')) (10, ('a', 'ta', 'tan', 'tang', 'stang', 'strang', 'strange', 'stranger', 'strangers', 'stranglers'))
这是每个起始字母的结果。当然,例外是字典中不必包含单个起始字母。可以用它组成一些2个字母的单词。
(10, ('a', 'ta', 'tap', 'tape', 'taped', 'tamped', 'stamped', 'stampede', 'stampedes', 'stampeders')) (9, ('b', 'bo', 'bos', 'bods', 'bodes', 'bodies', 'boodies', 'bloodies', 'bloodiest')) (1, ('c',)) (10, ('d', 'od', 'cod', 'coed', 'coped', 'comped', 'compted', 'competed', 'completed', 'complected')) (10, ('e', 're', 'rue', 'ruse', 'ruses', 'rouses', 'arouses', 'carouses', 'carousels', 'carrousels')) (9, ('f', 'fe', 'foe', 'fore', 'forge', 'forges', 'forgoes', 'forgoers', 'foregoers')) (10, ('g', 'ag', 'tag', 'tang', 'stang', 'strang', 'strange', 'strangle', 'strangles', 'stranglers')) (9, ('h', 'sh', 'she', 'shes', 'ashes', 'sashes', 'slashes', 'splashes', 'splashers')) (11, ('i', 'pi', 'pin', 'ping', 'oping', 'coping', 'comping', 'compting', 'competing', 'completing', 'complecting')) (7, ('j', 'jo', 'joy', 'joky', 'jokey', 'jockey', 'jockeys')) (9, ('k', 'ki', 'kin', 'akin', 'takin', 'takins', 'takings', 'talkings', 'stalkings')) (10, ('l', 'la', 'las', 'lass', 'lassi', 'lassis', 'lassies', 'glassies', 'glassines', 'glassiness')) (10, ('m', 'ma', 'mas', 'mars', 'maras', 'madras', 'madrasa', 'madrassa', 'madrassas', 'madrassahs')) (11, ('n', 'in', 'pin', 'ping', 'oping', 'coping', 'comping', 'compting', 'competing', 'completing', 'complecting')) (10, ('o', 'os', 'ose', 'rose', 'rouse', 'rouses', 'arouses', 'carouses', 'carousels', 'carrousels')) (11, ('p', 'pi', 'pin', 'ping', 'oping', 'coping', 'comping', 'compting', 'competing', 'completing', 'complecting')) (3, ('q', 'qi', 'qis')) (10, ('r', 're', 'rue', 'ruse', 'ruses', 'rouses', 'arouses', 'carouses', 'carousels', 'carrousels')) (10, ('s', 'us', 'use', 'uses', 'ruses', 'rouses', 'arouses', 'carouses', 'carousels', 'carrousels')) (10, ('t', 'ti', 'tin', 'ting', 'sting', 'sating', 'stating', 'estating', 'restating', 'restarting')) (10, ('u', 'us', 'use', 'uses', 'ruses', 'rouses', 'arouses', 'carouses', 'carousels', 'carrousels')) (1, ('v',)) (9, ('w', 'we', 'wae', 'wake', 'wakes', 'wackes', 'wackest', 'wackiest', 'whackiest')) (8, ('x', 'ax', 'max', 'maxi', 'maxim', 'maxima', 'maximal', 'maximals')) (8, ('y', 'ye', 'tye', 'stye', 'styed', 'stayed', 'strayed', 'estrayed')) (8, ('z', 'za', 'zoa', 'zona', 'zonae', 'zonate', 'zonated', 'ozonated'))