“k”中所有常见子串的集合或“n”个字符串中的更多字符串

时间:2015-03-23 14:30:10

标签: string algorithm substring

Iam正在寻找一种算法,在'n'个总字符串数中找到至少'k'个字符串中的一组公共子串。

例如,如果我有5个字符串,那么n = 5 我想找到所有3个或更多字符串中常见的子串,然后k = 3.

输出应该是一组任意长度的子串,这些子串在至少3个字符串中很常见。

所以

  1. abcdx
  2. EFGH
  3. xyabcz
  4. ijklxmno
  5. pqrstbcduvwxabcd
  6. 应该给出类似的东西 ABC, AB, 公元前, b, C, 一个, X

    搜索互联网的问题是我不知道这个问题的确切关键词。基本搜索会产生最长公共子字符串,这可能与我正在寻找的相关但不完全相同。

    我的问题,已知的问题已经在文献中发表了既定的解决方案?指向正确关键字或引用文章的任何指针?

    或者我必须将其指定为我自己的问题并为其创建算法?我脑海中最基本的想法是

    1. 将所有字符串分解为其子字符串并将其存储在相应的字符串中。
    2. 取所有'n'组并将其交点作为结果。
    3. 对于n-1组的所有组合 选择一个组合,然后选择它们的交点并将其与结果联合起来。
    4. 对n-1,n-2,n-3,...,k组合的大小重复步骤3
    5. 结果将包含至少k个字符串中常见的所有公共子字符串。我认为这会有效,但如果有一些聪明的方法做同样的事情,那么我想使用和引用它。

      特别是我不是在任何特定于语言的实现之后。我只是在寻找算法,或者在文献中找到这样的问题及其解决方案。

1 个答案:

答案 0 :(得分:0)

你可以这样做:

  1. 创建从字符串到出现次数的地图(让我们称之为cnt)。

  2. 对于每个给定的字符串,请执行以下操作:

    • 创建一组所有子字符串S

    • 对于S中的每个字符串,在cnt中为该字符串的出现次数添加一个。

  3. cnt地图中选择所有具有出现次数> = k的条目。

  4. 一些伪代码:

    cnt = an empty map
    for string <- strings
        for substr <- set of substrings of the string
            cnt[substr]++
    for entry <- cnt
        if entry.value >= k
            print entry.key