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

时间:2011-12-08 04:30:22

标签: c++ algorithm search data-structures suffix-tree

这是一个采访问题:

  

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

我的解决方案:

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

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

如何提高效率?

6 个答案:

答案 0 :(得分:7)

你的一般方法也不错。

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

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

现在,在您的词典中,您可能会有请求苍白。按照建议完成后,您的字典将(除其他外)包含以下映射:

...
aelp -> pale
aelp -> plea
...

现在,要查找您的字谜,您只需找到 aelp 的条目(例如,使用建议的后缀树方法),而不是全部4条! = 跳跃的24种排列。

答案 1 :(得分:2)

快速替代解决方案 - 全部取决于相关数据结构的大小。

如果字典合理小且字符串相当长,您可以遍历字典中的每个条目并确定它们是否是字符串的排列。您可以更聪明 - 您可以对字典进行排序并跳过某些条目。

答案 2 :(得分:1)

您可以从排序的字符列表到单词列表构建地图。

例如,鉴于这些:

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)

在这个小样本中,我们没有匹配项,但对于某个特定单词,您可以在内部对其进行排序,并将其作为关键视图查看地图。

答案 3 :(得分:1)

为什么不使用哈希映射来存储字典单词?所以你得到了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

答案 4 :(得分:1)

你应该把这些话放进一个特里。然后,您可以在生成排列时查找单词。您可以跳过整个排列块,第一部分不在trie中。

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

答案 5 :(得分:0)

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

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

2)使用“find / find_if”查找字典。