Algorithm 查找给定字符串的所有(英文单词)子字符串

Algorithm 查找给定字符串的所有(英文单词)子字符串,algorithm,data-structures,Algorithm,Data Structures,这是一个访谈:查找给定字符串的所有(英文单词)子字符串。(每一次=每一次,每一次,每一次) 显然,我们可以循环所有子字符串,并对照一本英语词典检查每个子字符串,并将其组织为一组。我相信这本字典足够小,可以放得下这只公羊。如何组织词典?至于我记得的,最初的拼写命令在位图中加载了单词文件,表示一组单词哈希值。我会从那开始 另一个解决方案是从字典构建的trie。使用trie,我们可以循环所有字符串,并检查每个字符的trie。我猜这个解决方案的复杂性在最坏的情况下是一样的(O(n^2)) 这有意义吗?你

这是一个访谈:查找给定字符串的所有(英文单词)子字符串。(每一次=每一次,每一次,每一次)

显然,我们可以循环所有子字符串,并对照一本英语词典检查每个子字符串,并将其组织为一组。我相信这本字典足够小,可以放得下这只公羊。如何组织词典?至于我记得的,最初的
拼写
命令在
位图
中加载了
单词
文件,表示一组单词哈希值。我会从那开始

另一个解决方案是从字典构建的
trie
。使用trie,我们可以循环所有字符串,并检查每个字符的
trie
。我猜这个解决方案的复杂性在最坏的情况下是一样的(
O(n^2)


这有意义吗?你会建议其他的解决方案吗?

< P>我不确定TIE会很容易地工作,以匹配从字符串中间开始的子字。

另一个具有类似概念的解决方案是使用状态机或正则表达式。 正则表达式就是word1 | word2 |。。。。 我不确定标准正则表达式引擎是否能够处理覆盖整个英语语言的表达式,但考虑到字典,构建等价的状态机应该不难


一旦编译了正则表达式\构建了状态机,分析特定字符串的复杂性为O(n)

第一个解决方案可以改进为每个单词长度都有一个不同的哈希映射(以减少冲突),但除此之外,我想不出任何更好的解决方案。

“构造一个类似于trie的有限状态机,在各个内部节点之间具有附加链接。”

但是,所有考虑到的“从英语词典中构建一个trie,并在它上同时搜索给定字符串的所有后缀”对于面试来说应该是非常好的。

在所有子字符串上循环检查哈希的复杂性取决于您的哈希计算-存在平均长度不是O(1)的θ(n^2)子字符串,因此您需要计算一个部分散列,该散列可以一次递增一个字符,以保持O(n^2)总的来说。trie或DAWG查找也是如此,当然,您可能希望从给定点开始逐步检查所有字符串,但可能更明显的是,这样做是正确的。遍历trie,从每个可能的起始字符开始,并输出您认为非常有效的所有合法单词;您一旦你发现一个字符序列不可能是一个单词的前缀,你就停止寻找,而且你做的也不可能比O(n^2)更好——可能每个子字符串都是有效的,并且有O(n^2)其中之一。这基本上与trie解决方案相同。@biziclop-我使用过一个库,其中包含所有英语的最低状态DFA,它比标准trie更紧凑。是的,它基本上与trie相同,但内存效率更高。