C++ 给定一个字符串,在字典中查找该字符串的所有单词排列

C++ 给定一个字符串,在字典中查找该字符串的所有单词排列,c++,algorithm,search,data-structures,suffix-tree,C++,Algorithm,Search,Data Structures,Suffix Tree,这是一个面试问题: 给定一个字符串,在字典中查找该字符串的所有单词排列 我的解决方案: 将字典中的所有单词放入后缀树,然后搜索树中字符串的每个排列 搜索时间为O(n),其中n是字符串的大小。但是字符串可能有n排列 如何提高效率?一个快速的替代解决方案-所有这些都取决于相关数据结构的大小 如果字典相当小,字符串相当长,则可以检查字典中的每个条目,并确定它们是否是字符串的排列。你可以更聪明一些——你可以对字典进行排序并跳过某些条目 你的一般方法还不错 但是,您可以通过重新排列单词,使其所有字符都按字

这是一个面试问题:

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

我的解决方案:

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

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


如何提高效率?

一个快速的替代解决方案-所有这些都取决于相关数据结构的大小


如果字典相当小,字符串相当长,则可以检查字典中的每个条目,并确定它们是否是字符串的排列。你可以更聪明一些——你可以对字典进行排序并跳过某些条目

你的一般方法还不错

但是,您可以通过重新排列单词,使其所有字符都按字母顺序排列,然后在字典中搜索,在字典中,每个单词同样按字母顺序排列并映射到原始单词,从而避免搜索每个排列

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

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

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

所以现在,要找到你的字谜,你只需要找到aelp的条目(例如,使用建议的后缀树方法),而不是所有4个24种leap

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

例如,鉴于:

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

另一个简单的解决方案是如下算法:

1) 使用“下一个置换”查找唯一置换


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

您应该将单词放入trie中。然后,您可以在生成排列时查找单词。您可以跳过整个置换块,其中第一部分不在trie中


这项任务的通常名称是查找字谜。使用该搜索词,您应该可以找到一种经典方法。这是我为您提供的分析想法。对字典中的每个单词进行排序。O(n*m*lgm),n是字典的大小,m是放入hashmap的每对单词的平均长度。如果关键字冲突,请将未排序的单词放入列表中。这是O(n)。对给定字符串进行排序,O(p lg p),p是字符串的大小。在hashmap中搜索已排序的字符串(一个字谜)。O(1)。字谜的键列表是所有排列。所以,总的来说是O(n*m*lgm+pgp),通常是p