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

时间:2011-03-02 18:51:43

标签: algorithm data-structures

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

显然,我们可以循环遍历所有子串并根据英语词典检查每个子串,组织为一组。我相信字典足够小以适应RAM。如何组织字典?至于我记得,原始spell命令在words中加载了bitmap文件,表示一组单词哈希值。我会从那开始。

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

是相同的

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

3 个答案:

答案 0 :(得分:6)

Aho-Corasick string matching algorithm“构建一个类似于trie的有限状态机,在各个内部节点之间有额外的链接。”
但是所有被认为是“从英语词典中构建一个特里并且对所有字符串的所有后缀进行同时搜索”的内容应该非常适合采访。

答案 1 :(得分:1)

我不确定Trie是否能够轻松地匹配从字符串中间开始的子词。

具有类似概念的另一种解决方案是使用状态机或正则表达式。 正则表达式只是word1 | word2 | .... 我不确定标准正则表达式引擎是否可以处理覆盖整个英语的表达式,但是在给定字典的情况下构建等效状态机应该不难。

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

答案 2 :(得分:1)

第一个解决方案可以被细化为每个字长有一个不同的哈希映射(以减少冲突),但除此之外我无法想到任何明显更好的。

相关问题