字符串中最长的重复(分散)子序列


26

非正式问题陈述:

给定一个字符串(例如,我们希望将一些字母成红色,将一些字母成蓝色(有些根本不),这样,从左到右仅读取红色字母会产生与仅读取蓝色字母相同的结果。ACCABBAB

在示例中,我们可以为它们着色:ACCABBAB

因此,我们说是的重复子。它也是最长的重复子序列(易于检查)。A C C A B B A BCABACCABBAB

我们可以有效地计算最长的重复子序列吗?

正式问题:

确定字符串和某个是否难为NP,字符串中是否存在长度为的重复子序列?ķkk

  • 如果是这样:哪个问题可以减少到这个问题?
  • 如果不是:什么是有效算法?(显然,此算法可用于计算最长的重复子序列)

奖励问题:

如果字母的大小受常数限制,它们将始终是长度为的重复子序列吗?n/2o(n)

(这对于二进制字母来说是正确的。)

编辑2:对于奖金问题的否定答案,众所周知的是大小至少为字母。实际上,对于大小为Σ的字母,存在具有最长重复子序列且长度仅为O(n·Σ^ {-1/2})的字符串。随机字符串足以证明这一点。结果已经存在,但我忽略了它。5ΣO(n·Σ1/2)

编辑: 注意:

有些人说“子序列”时,其意思是“子串”。我不。这不是找到子字符串两次的问题。


塞克蒂,谢谢你。您是对的:我的第一句话是错误的;我现在已经删除了。另一方面,我剩余的评论谈论非连续的子序列。如果是固定的,则有一种方法可以在时间内解决您的问题(具有不连续的子序列,必须不重叠)。每个dp子问题都会跟踪到目前为止选择的所有红色字母和所有蓝色字母的索引。这可能没有意思,因为它没有告诉我们当是输入的一部分时会发生什么。kO(n2k+2)k
DW

@DW为什么用最长公共子序列的这种修改不能有效地回答形式问题?也许我缺少一些东西,有人可以为我澄清。
Bryce Kille

@BryceKille,我不知道;也许可以。如果您知道该怎么做,希望您能写一个答案!
DW

Answers:


-2

这可以解决 多项式时间通过构造图,其中每个节点代表某些重复子序列中的点,使得。节点和之间的边缘表示可以被延续以形成长度为2的重复子序列。G(i,j)SS[i]=S[j]uvuv

1.查找节点。这可以在时间内通过为每个字符建立索引的排序列表,然后枚举唯一对来完成。不超过节点。O(n2)cm=n2

2.找到边缘。检查节点可以由节点继续需要时间,因此,考虑所有对此步骤将花费时间。O(1)uv(u,v)O(m2)

3.请注意,中的最长路径可能不是有效的重复子序列。考虑路径和。如果存在边缘则是长度为3的有效重复子序列。因此,找到所有长度为3的重复子序列需要时间。通常情况下,需要花费线性时间来检查两个有效路径长度为可以组合为长度为的有效路径。GabbcacabcO(m4)nn+1

4.重复第3步,直到找不到更多路径。


嗯 太快了 在步骤3中,要考虑的子序列数越来越大。所以它不是多项式。
noplogist 2015年

1
欢迎使用CS.SE,并感谢您尝试解决此问题!恐怕我不理解您的算法。什么是步骤3?我在“ 3”中看到的所有内容。是一些声明性声明/观察,但我没有看到该算法应做的程序说明。另外,我看不到重复步骤3的含义,也看不到您声称时间足够的理由。您随后的评论听起来好像您不再相信答案是正确的。如果是这样,最好删除答案,以免造成混淆。O(nnm2)
DW

如果以后可以找到答案,则可以始终取消删除或发布新答案。
DW

DW,谢谢。输入到步骤3的是长度为n的所有重复子序列,输出是长度为n + 1的所有重复的子序列。我相信该算法是正确的,但它不是多项式时间算法。我现在标记了我认为不正确的声明。
noplogist 2015年

谢谢。我明白。不幸的是,对于这些修订,恐怕此答案无法回答所提出的问题。问题是:这是NP难点吗?有没有有效的算法?显示存在指数时间算法无助于回答这些问题中的任何一个。确实,在没有调用任何花哨技术的情况下,有一个指数时间算法可以解决问题,这已经是微不足道的了。感谢您的尝试。
DW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.