【发布时间】:2014-07-03 13:09:12
【问题描述】:
我有一个值序列,我想知道它是否包含某个最小长度的重复子序列。例如:
1, 2, 3, 4, 5, 100, 99, 101, 3, 4, 5, 100, 44, 99, 101
包含两次子序列3, 4, 5, 100。它还包含两次子序列99, 101,但该子序列是两个短的需要关心。
有没有一种有效的算法来检查这样的子序列是否存在?我对序列的定位不是特别感兴趣(尽管这对验证很有帮助),我主要只对真/假答案感兴趣,给定一个序列和一个最小子序列长度。
到目前为止,我唯一的方法是暴力搜索:对于序列中的每个项目,找到该项目出现的所有其他位置(已经在 O(N^2)),然后向前走一步从每个位置的时间,看看下一个项目是否匹配,并继续前进,直到我发现不匹配或找到足够长度的匹配子序列。
我有但未能发展成实际方法的另一个想法是构建所有序列的树,以便每个数字都是一个节点,并且是它之前的数字的子节点,无论那个节点恰好已经在树中。
【问题讨论】:
-
看起来您正在寻找子字符串,而不是子序列。查看什么是子序列:en.wikipedia.org/wiki/Subsequence,“子序列是可以通过删除一些元素而不改变其余元素的顺序从另一个序列派生的序列”。对于子序列和子字符串都存在有效的算法。
-
后缀树为 O(n)