我要求在编程竞赛中解决以下问题(facebook招聘)
输入:子字符串列表:
{"bar","foo","hi"} //from 1 to 100 sub-strings
和句子:
"hellothisisfoobarhi" //from 1 to 1000000 character
输出:12 //句子中第一个匹配的索引(foo)
另一个例子是:
子串:{ “喜”, “喜”}
句子:“hiJonIamSayinghihiforYou”
输出:15 // hi的索引,第二个'hi',因为第一个'hi'只是一个技巧,sub-sentece是'hi'hi“
另外一个例子:
子串:{ “喜”, “富”}
句子:“sayfoohi”
输出:6 //顺序无关紧要,只需要彼此相邻
谁知道这个问题的好算法?
答案 0 :(得分:1)
构造一个大字符串的后缀树 - 树的结构是O(n),其中n是大字符串的长度。
现在你可以在O(m)时间内找到任何子串的位置(其中m是子串的长度),只需跟随树中的子串 - 子串结束的节点或叶子将对应于索引的键保存到大字符串中。
通过一组子字符串查找大字符串中的位置,跟踪最小索引。
答案 1 :(得分:0)
另一种方式 - 专注于子串而不是主串 - 将是http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm