从子串列表中获取字符串

时间:2011-12-03 10:58:16

标签: string algorithm substring string-matching

我要求在编程竞赛中解决以下问题(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 //顺序无关紧要,只需要彼此相邻

谁知道这个问题的好算法?

2 个答案:

答案 0 :(得分:1)

构造一个大字符串的后缀树 - 树的结构是O(n),其中n是大字符串的长度。

现在你可以在O(m)时间内找到任何子串的位置(其中m是子串的长度),只需跟随树中的子串 - 子串结束的节点或叶子将对应于索引的键保存到大字符串中。

通过一组子字符串查找大字符串中的位置,跟踪最小索引。

答案 1 :(得分:0)

另一种方式 - 专注于子串而不是主串 - 将是http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm