如果有一个词混杂(即ofbaor),那么解读这些字母以创建一个真实单词(即foobar)的方法是什么?我可以看到这有两种方法,我想我知道如何在.NET中做到这一点,但我很想知道其他一些解决方案是什么样的(总是很高兴看到我的解决方案是否最佳)。
这不是家庭作业或类似的东西,我只是在论文的当地漫画部分看到一个混乱的词(是的,好的'时尚新闻纸),而我的工程师开始思考。
编辑: 如果可以,请发布一些伪代码或真实代码;通过看到这样的例子,尝试扩展语言知识总是很好。
答案 0 :(得分:13)
有一个字典,按字母顺序排列每个单词的字母。然后把你的字母混杂起来 - 用排序字母串查找字典中的所有单词。
因此,作为一个例子,“熊”和“裸”这两个词将在字典中如下:
key word
----- ------
aber bear
aber bare
如果你被混淆了,'earb',你会把字母排成'像',并且能够在字典中查找两个可能的单词。
答案 1 :(得分:1)
创建字符串的所有排列,并在字典中查找它们。
您可以通过查找开始单词的较短字符串进行优化,如果字典中没有以这些字符串开头的合适长度的单词,则从进一步考虑的那些字母开始消除排列。
答案 2 :(得分:1)
CodeProject有几篇文章here和here。第二个使用递归。维基百科还概述了几种算法here。维基百科的文章还提到了一个名为Jumbo的程序,该程序使用更具启发性的方法来解决问题,就像人类一样。似乎有一些方法可以解决这个问题。
答案 3 :(得分:1)
根据字符串的长度,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
答案 4 :(得分:1)
答案 5 :(得分:0)
一种方法是将您的字典拆分为具有特定长度的已排序子字典,例如 1 个字母的单词、2 个字母的单词…… 当您搜索某个混杂的单词时,将可能的排列数与相应词典中的单词数进行比较。如果前者较大,则将字典中的单词与杂乱无章的单词进行比较,如果后者较大,则创建排列,然后在字典中搜索这些单词。 您还可以通过根据第一个字母和它们出现的频率将字典划分为更小的子集来进一步优化它,然后根据第二个字母进一步划分。然而,更多的划分可能会使数据库显着复杂化并减慢搜索速度。