Algorithm 从字符串中查找子字符串
输入:字符串S=aagatgatagat 输出:最大重复次数,如GATA(如位置3和8)、GAT(如位置3、8和13)等Algorithm 从字符串中查找子字符串,algorithm,language-agnostic,suffix-tree,Algorithm,Language Agnostic,Suffix Tree,输入:字符串S=aagatgatagat 输出:最大重复次数,如GATA(如位置3和8)、GAT(如位置3、8和13)等 最大重复是指子串t在S中出现k>1次,如果t向左或向右扩展,则出现的次数将少于k次 内部节点的叶后代是后缀,每个后缀都有一个左字符 如果所有叶子体的左字符不完全相同,则称为“左多样化”节点 最大重复次数由不同的内部节点决定 总体思路: 构建后缀树,然后在树上执行DFS(深度优先搜索) 对于每个叶,使用其左字符对其进行标记 对于每个内部节点: 如果至少有一个子项标记为*,
- 最大重复是指子串t在S中出现k>1次,如果t向左或向右扩展,则出现的次数将少于k次
- 内部节点的叶后代是后缀,每个后缀都有一个左字符
- 如果所有叶子体的左字符不完全相同,则称为“左多样化”节点
- 最大重复次数由不同的内部节点决定
- 构建后缀树,然后在树上执行DFS(深度优先搜索)
- 对于每个叶,使用其左字符对其进行标记
- 对于每个内部节点:
- 如果至少有一个子项标记为*,则使用*
- 否则,如果其子项的标签多种多样,请使用*
- 否则,所有子节点都有相同的标签,请将其复制到当前节点
上述观点正确吗?伪代码是如何生成的?然后我可以试着自己编写程序。你的想法很好,但是有了后缀树,你可以做一些更简单的事情 让T成为序列的后缀树 设x是T中的一个节点,T_x是根为x的T的子树 设N_x是T_x中的叶数 让单词(x)是通过将T从根遍历到节点x而创建的单词 现在使用后缀树的定义,我们得到: 单词(x)的重复次数=N_x,该单词的位置是每个叶子的标签 该算法将是一个基本的树遍历,对于树中的每个节点,计算N_x,如果N_x>2,则将其添加到结果中(如果您也需要位置,则可以添加每个叶的标签) 伪代码: 输入: 我的顺序 输出: 结果(重复计数和位置的单词列表) 算法: T=后缀树(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)] )
返回结果
示例:
让我们以维基百科的后缀树为例:“香蕉”:
我们得到:
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}
我发现这篇论文似乎和你一样对待你的问题,所以是的,我认为你的方法是写: 提取 本文提出了两种算法。第一篇摘录 字母表西格玛上定义的序列中的重复模体。对于 例如,Sigma可以等于{A,C,G,T}和序列 表示DNA大分子的编码。寻找的主题 对应于同一字母表中出现最少的单词 序列中每次最多有e个不匹配的次数q (q称为法定人数限制)。[…] 您可以下载并查看它,作者为您的算法提供了伪代码
希望这有帮助@Bryan,是的..试图写出编程代码..我想在伪代码方面寻求一些帮助..然后我将尝试写出整个编程…DFS代表深度优先搜索,而不是深度强制搜索。@rock:找出算法(一般来说解决问题)可能是程序员工作中最重要的部分。编码或多或少是一种机械活动。好问题,更重要的是,有效问题。将此与其他“plz发送代码”作业请求进行对比。我不知道为什么每当有人在这里有家庭作业问题时,人们都会大发雷霆+“为了一个有趣的问题,我向你道歉。”托马斯特。这次我没有画:D.从维基百科的后缀树页面上取的。