从字符串中查找子字符串

时间:2011-10-14 05:36:43

标签: algorithm language-agnostic suffix-tree

输入:字符串S = AAGATATGATAGGAT。

输出:最大重复次数,如GATA(如位置3和8),GAT(如位置3,8和13)等等......

  • 最大重复是子串t在S中发生k> 1次,如果t向左或向右延伸,则发生的次数少于k次。

  • 内部节点的叶子后代是后缀,每个后缀都有一个左字符。

  • 如果所有叶子后代的左侧字符都不完全相同,则称为“左侧多样化”节点。

  • 最大重复是左 - 多样化的内部节点。

总体思路:

  • 构建后缀树,然后在树上执行DFS(深度优先搜索)

  • 对于每个叶子,用左侧字符标记

  • 对于每个内部节点:

  • 如果至少有一个孩子标有*,则用*

  • 标记
  • 如果其子女的标签多种多样,请标注*。

  • 否则所有孩子都有相同的标签,将其复制到当前节点

上述想法是否正确?伪代码怎么样?然后我可以尝试自己编写程序。

1 个答案:

答案 0 :(得分:3)

你的想法很好,但是使用后缀树你可以做得更轻松。

  

设T为序列的后缀树。

     

设x为T中的节点,T_x是带有根x的T的子树。

     

设N_x为T_x中的叶数

     

让word(x)成为通过遍历T从根到节点x

创建的单词      

现在使用后缀树的定义:

     

单词(x)= N_x的重复次数以及这些单词的位置是每个叶子的标签

用于此的算法将是基本树遍历,对于树中的每个节点计算N_x,如果N_x> 2将此添加到您的结果中(如果您也想要位置,则可以添加每个叶子的标签)

伪码:

  

输入:

     

mySequence

     

<强>输出:

     

结果(与计数和位置重复的单词列表)

     

算法:

     

T = suffixTree(mySequence)

     

对于T中的每个内部节点X:

  T_X = subTree(T)
  N_X = Number of lead (T_X)
  if N_X >=2 :
  Result .add ( [word(X), N_X , list(label of leafs)] )
     

返回结果

示例:

让我们以后缀树的维基百科示例为例:“BANANA”

enter image description here

我们得到:

N_A = 3 so "A" repeats 3 times in position {1,3,5}
N_N=2  so "N" repeats 2 times  in position {2,4}
N_NA=2  so "NA" repeats 2 times in position {2,4}

我发现这篇论文看起来像你一样对待你的问题,所以是的,我认为你的方法是写的:

Spelling approximate repeated or common motifs using a suffix tree

  

摘录

     

我们在本文中提出了两种算法。第一个提取   从字母表Sigma定义的序列重复的图案。对于   例如,Sigma可能等于{A,C,G,T}和序列   代表DNA大分子的编码。搜索的主题   对应于同一字母表中出现最少的单词   序列中的次数q,每次最多不匹配   (q称为仲裁约束)。[...]

您可以下载并查看它,作者为您的算法提供伪代码。

希望这有帮助