给定一个字符串,在字典中找出它的所有组成单词的排列

Given a string, find all its permutations that are a word in dictionary

本文关键字:排列 单词 字典 一个 字符串      更新时间:2023-10-16

这是一个面试问题:

给定一个字符串,在字典中找出它的所有组成单词的排列。

我的解决方案:

将字典中的所有单词放入后缀树中,然后在树中搜索字符串的每个排列。

搜索时间为O(n),其中n为字符串的长度。但是字符串可能有n!排列。

如何提高效率?

你的总体方法还不错。

但是,您可以通过重新排列单词,使其所有字符按字母顺序排列,然后在字典中搜索,其中每个单词以类似的方式重新排列成字母顺序并映射到原始单词,从而避免必须搜索每个排列。

我意识到这可能有点难以理解,所以这里有一个例子。说你的词是跳跃。将其重新排列到 ahelp

现在,在您的字典中可能有pleapale这两个词。按照建议完成后,您的字典将(除其他事项外)包含以下映射:

...
aelp -> pale
aelp -> plea
...
所以现在,要查找字谜,您只需要查找和help 的条目(例如,使用建议的后缀树方法),而不是查找所有4个! .

一个快速的替代解决方案——这取决于所讨论的数据结构的大小。

如果字典足够小而字符串足够长,您可以遍历字典中的每个条目并确定它们是否是字符串的排列。你可以更聪明一些——你可以对字典进行排序,跳过某些条目。

您可以构建一个从排序的字符列表到单词列表的映射。

例如:

Array (him, hip, his, hit, hob, hoc, hod, hoe, hog, hon, hop, hos, hot)

你会在内部对它们进行排序:

 Array (him, hip, his, hit, bho, cho, dho, eho, gho, hno, hop, hos, hot)

排序结果:

 Array (bho, cho, dho, eho, gho, him, hip, his, hit, hno, hop, hos, hot)

在这个小样本中,我们没有匹配,但是对于一个特定的单词,您将在内部对其进行排序,并将此作为键查看您的映射。

为什么不使用散列映射来存储字典中的单词呢?所以你得到O(1)查找时间。如果你的输入是英文的,你可以建立另一个表来告诉你字典中所有可能的字母,使用这个表,你可以在开始的时候过滤一些输入。示例如下:

result_list = empty;   
for(char in input)
{
   if(char not in letter_table)
   {
      return result_list;
   }
}
for(entry in permutations of input)
{
    if(entry in dictionary_hash_table)
    { 
        result_list->add_entry();
    }
}
return result_list

你应该把这些词放到一个格子里。然后你可以在生成排列时查找单词。如果第一部分不在树中,您可以跳过整个排列块。

http://en.wikipedia.org/wiki/Trie

另一个简单的解决方案可以如下面的算法,

1)使用"next_permutation"查找唯一的排列。

2)使用"find/find_if"查找字典