这是一个采访问题:
给定一个字符串,找到它在字典中的单词的所有排列。
我的解决方案:
将字典的所有单词放入后缀树中,然后搜索树中字符串的每个排列。
搜索时间为O(n)
,其中n
是字符串的大小。但字符串可能有n!
个排列。
如何提高效率?
答案 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中。
答案 5 :(得分:0)
另一个简单的解决方案可以是下面的算法,
1)使用“next_permutation”查找唯一的排列。
2)使用“find / find_if”查找字典。