给定一个字符串,在字典中找出它的所有组成单词的排列
Given a string, find all its permutations that are a word in dictionary
这是一个面试问题:
给定一个字符串,在字典中找出它的所有组成单词的排列。
我的解决方案:
将字典中的所有单词放入后缀树中,然后在树中搜索字符串的每个排列。
搜索时间为O(n)
,其中n
为字符串的长度。但是字符串可能有n!
排列。
如何提高效率?
你的总体方法还不错。
但是,您可以通过重新排列单词,使其所有字符按字母顺序排列,然后在字典中搜索,其中每个单词以类似的方式重新排列成字母顺序并映射到原始单词,从而避免必须搜索每个排列。
我意识到这可能有点难以理解,所以这里有一个例子。说你的词是跳跃。将其重新排列到 ahelp 。
现在,在您的字典中可能有plea和pale这两个词。按照建议完成后,您的字典将(除其他事项外)包含以下映射:
...
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"查找字典
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 文本文件中的单词链表
- 为什么不;名字在地图上是按顺序排列的吗
- 在指针的帮助下,文本文件中单词的频率
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 如何根据单词在文本中出现的概率输出单词
- 从字符串变量中逐字符读取单词
- 使用std::mt19937从字符串中返回一个随机单词
- 如何用for循环在c++中生成单词三角形
- 将数字转换为单词
- 使用if-else将数字转换为单词
- 尝试在 c++ 中按字母顺序排列单词时出现分段错误
- 如何用单词排列向量中的每个字符升序?
- 它如何排列单词以使用 qsort 和字符串
- 按字母顺序排列单词
- 增加单词之间的空格,按列排列单词
- 我编写了一个C++程序来打印单词字母的排列.我想知道是否有其他更简单的方法可以做到这一点
- 过滤掉仅与字典中的单词匹配的排列
- 给定一个字符串,在字典中找出它的所有组成单词的排列