给定一组词汇表,可以用来查找词汇表中与给定子字符串匹配的所有单词的最佳数据结构是什么?
假设“Ap”是子串,
应退回“Apple”和“申请表”
因为在这种情况下,“Ap”位于两个字符串的开头,我可以想到使用尝试。
但是,如果要匹配的子字符串可以在词汇表的单词中找到,那该怎么办呢? 例如:如果给出“ap”,则还应返回“shape”,因为“ap”出现在“形状”中。
词汇量非常大。
答案 0 :(得分:2)
你想要的是suffix tree。这将在一个trie中存储(一组)字符串的所有后缀(在您的情况下,是一组单词)。 trie的每个叶子都与具有该后缀的字符串集相关联。
搜索子字符串时,只需匹配trie根的子字符串;您的子字符串必须是某个后缀的前缀或者没有匹配项。发现匹配的存在是子字符串长度的线性时间。要确定所有匹配单词,您必须枚举可从匹配完成点访问的trie的所有叶子。这是一个树木行走问题;如果树有明显的分支,它可能有点贵。
您可以为每个trie节点预先计算一组关联的单词;这可能相当大,但现在你可以非常快速地确定匹配单词。
如果您只需要检查集合中的成员,直到找到具有一些不错属性的成员,我就会坚持使用枚举。