【问题标题】:Word Jumble Algorithm单词混乱算法
【发布时间】:2011-02-12 21:47:20
【问题描述】:
给定一个单词混乱(即 ofbaor),有什么方法可以解读字母以创建一个真实的单词(即 foobar)?我可以看到这有几种方法,我想我知道如何在 .NET 中做到这一点,但我很想知道其他一些解决方案是什么样的(总是很高兴看到我的解决方案是否是最优的)。
这不是家庭作业或类似的东西,我只是在报纸的本地漫画部分看到一个词混杂(是的,很好的老式新闻纸),我的工程师开始思考。
编辑:
如果可以,请发布一些伪代码或真实代码;通过看到这样的例子来尝试扩展语言知识总是很好的。
【问题讨论】:
标签:
language-agnostic
puzzle
【解决方案1】:
创建字符串的所有排列,并在字典中查找它们。
您可以通过查找以单词开头的较短字符串进行优化,如果字典中没有以这些字符串开头的合适长度的单词,则无需进一步考虑以这些字母开头的排列。
【解决方案2】:
有一本按每个单词的字母排序的字典。然后带您对字母进行排序 - 通过该排序字母字符串查找字典中的所有单词。
因此,例如,“熊”和“裸”这两个词在字典中的排列如下:
key word
----- ------
aber bear
aber bare
如果你得到了混乱的“earb”,你会将字母排序为“aber”,并且能够在字典中查找这两个可能的词。
【解决方案3】:
CodeProject 有几篇文章here 和here。第二个使用递归。维基百科还概述了一些算法here。维基百科的文章还提到了一个名为 Jumbo 的程序,它使用一种更具启发性的方法来像人类一样解决问题。似乎有几种方法可以解决这个问题。
【解决方案4】:
根据字符串的长度,WhirlWind 的方法可能会更快,但是另一种具有或多或少 O(n) 复杂度的方法是,而不是创建字符串的所有排列并查找它们,你去遍历字典中的所有单词,看看是否可以从输入字符串构建每个单词。
一个真正提前知道字典中单词数量的智能算法可以做这样的事情:
sort letters in jumbled string
if factorial(length of jumbled string) > count of words in dictionary:
for each word in dictionary:
sort letters in dictionary word
if sorted letters in dictionary word == sorted letters in jumbled string:
append original dictionary word to acceptable word list
else:
create permutation list of jumbled letters
for each permutation of letters:
search in dictionary for permutation
if permutation in dictionary:
add word to acceptable word list
【解决方案6】:
一种方法是将您的字典拆分为具有特定长度的已排序子字典,例如 1 个字母的单词、2 个字母的单词……
当您搜索某个混乱的单词时,将可能的排列数与相应词典中的单词数进行比较。如果前者较大,则将字典中的单词与混乱进行比较,如果是后者,则创建排列然后在字典中搜索。
您还可以通过根据第一个字母以及它们出现的频率将字典分成更小的子集来进一步优化它,然后根据第二个字母进一步划分。然而,更多的划分可能会使数据库显着复杂化并减慢搜索速度。