1
寻找最长的重复子序列
给定字符串,我想找到最长的重复(至少两次)子序列。也就是说,我想找到一个字符串,它是的子序列(不一定是连续的),使得。也就是说,是一个字符串,其一半连续出现两次。请注意,是的子序列,但不一定是子字符串。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例子: 对于“ ababccabdc”,它将是“ abcabc”,因为“ abc” =“ abc”和“ abc”在“ ababccabdc”中(至少)出现了两次(至少)。 对于“ addbacddabcd”,一个选项为“ dddd”,因为“ dd”出现两次(我不能多次使用相同的字母,但是这里我有4个“ d”,所以还可以),但其值为4。我可以找到更好的一个长度8:“ abcdabcd”,因为“ abcd”是“ addbacddabcd”的子字符串,该子字符串出现两次。 我有兴趣找到最长的重复子序列。这也称为“找到最长/最大的平方”,但我读过许多文章,其中为子字符串而不是子序列定义了平方。 我可以轻松地使用蛮力算法,该算法通过迭代字符串中的断点的所有选项来获取,然后我将在两个字符串中寻找最大/最长的公共子序列,但是使用动态编程技术每次检查将花费,因此整个时间将是。我发现了最长公共子序列更有效的算法,该算法采用,因此运行时间将为。O(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)O(n2logn)O(n2logn)O(\frac{n^2}{\log n})O(n3logn)O(n3logn)O(\frac{n^3}{\log n}) 我正在寻找一种更有效的算法来解决最长重复子序列问题。也许我对所有断点进行迭代的想法浪费了太多时间,并且可以减少为更少的迭代。或者也许以不同的态度解决这个问题。 我搜索了许多期刊和以前的问题,发现的大多数结果都与子字符串有关,而不是与子序列有关。 我还读到可以使用后缀树来完成此操作,但这也与子字符串有关,我不确定是否可以将这种想法扩展到子序列。 我正在寻找可以在时间中运行的解决方案。如果在时间上存在一个会更好(我不确定是否存在)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅logn)O(n \cdot \log n)