你的想法很好,但是使用后缀树你可以做一些更简单的事情。
让 T 成为您的序列的后缀树。
设 x 是 T 中的一个节点,T_x 是 T 的根 x 的子树。
令 N_x 为 T_x 中的叶子数
让 word(x) 是通过从根到节点 x 遍历 T 创建的词
现在使用后缀树的定义,我们得到:
word(x) = N_x 的重复次数,这个词的位置就是每个叶子的标签
这个算法将是一个基本的树遍历,对于树中的每个节点计算 N_x,如果 N_x > 2 将其添加到您的结果中(如果您也想要位置,您可以添加每个叶子的标签)
伪代码:
输入 :
我的序列
输出:
结果(以计数和位置重复的单词列表)
算法 :
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)] )
返回结果
例子 :
让我们以 wikipedia 的后缀树为例:“BANANA”:

我们得到:
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}
我发现这篇论文似乎以与您相同的方式处理您的问题,所以是的,我认为您的方法是 write :
使用后缀树拼写近似重复或常见的主题
提炼
我们在本文中介绍了两种算法。第一个从在字母 Sigma 上定义的序列中提取重复的基序。例如,Sigma 可能等于 {A, C, G, T},并且该序列代表 DNA 大分子的编码。搜索的主题对应于同一字母表中的单词,这些单词在序列中出现最少 q 次,每次最多有 e 个不匹配(q 称为 quorum 约束)。 [...]
您可以下载并查看它,作者为您的算法提供了伪代码。
希望这可以帮助