【问题标题】:getting a string from a list of substrings从子字符串列表中获取字符串
【发布时间】:2012-01-12 02:57:11
【问题描述】:

我在一次编程比赛(facebook招聘)中要求解决以下问题

输入:子字符串列表:

{"bar","foo","hi"} //from 1 to 100 sub-strings 

和句子:

"hellothisisfoobarhi" //from 1 to 1000000 character

输出:12 //句子中第一个匹配的索引(foo)

另一个例子是:

子字符串:{"hi","hi"}

句子:“hiJonIamSayinghihiforYou”

output:15 // hi 的索引,第二个 'hi' 因为第一个 'hi' 只是一个技巧,子句是 'hi' hi"

还有一个例子:

子字符串:{"hi","foo"}

句子:“sayingfoohi”

output:6 // 顺序无关紧要,只要彼此相邻即可

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

【问题讨论】:

  • 现在您编辑了您的帖子,但之前您说过“挑战自己”。你知道答案吗 ?如果是,为什么要在这里问。我不确定 StackOverFlow 是否会挑战人们。就是为了你的问题从别人那里得到帮助。
  • 不,我不知道解决方案,我正在尝试寻求帮助来解决问题。这个问题很有挑战性
  • fooxbarxhi 和 hifoobar 是否也匹配?我们能否负担得起对子字符串列表进行昂贵的预处理,或者它们是否会变得更频繁?
  • 不,它们应该存在于主句中
  • 是的,但它不构成这些子串可以构成的句子。

标签: string algorithm substring string-matching


【解决方案1】:

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

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

遍历一组子字符串,找到它们在大字符串中的位置,跟踪最小索引。

【讨论】:

  • 你能用哈希表或字典代替前缀树吗?
  • 当然——但选择取决于应用程序。如果您正在执行插入、查找和删除的组合,那么前缀树可能是最好的解决方案。否则,哈希表可以提供非常好的结果。同样,这取决于应用程序。
  • 另外,尝试促进最长前缀匹配,但散列不会
  • 真的不起作用...后缀树将定位任何子字符串,但 OP 希望在目标字符串中找到子字符串列表的排列
  • @parapurarajkumar 对.. 所以他必须遍历子字符串集,匹配 trie 中的每个子字符串,并跟踪最小值(我编辑了上面的帖子)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2020-03-24
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2013-06-27
    相关资源
    最近更新 更多