【问题标题】:How to find the longest continuous subsequence whose reverse is also a subsequence如何找到最长的连续子序列,其反向也是子序列
【发布时间】:2010-03-19 04:45:50
【问题描述】:

假设我有一个序列x1,x2,x3.....xn,我想找到最长的连续子序列xi,xi+1,xi+2......xi+k,其逆也是给定序列的子序列。 而如果有多个这样的子序列,那么我也必须找到最小的i。

例如:- 考虑序列:

abcdefgedcg 这里 i=3 和 k=2

aabcdddd 这里 i=5, k=3

我尝试查看原始最长公共子序列问题,但这是用于比较两个序列以找到最长公共子序列....但这里只有一个序列,我们必须从中找到子序列。请让我知道解决此问题的最佳方法是什么,以找到最佳解决方案。

【问题讨论】:

  • 第一个例子得到 i=2 k=3,第二个例子得到 i=5 k=4。
  • @Potatoswatter:不,你没有。再次阅读问题的陈述。 “k”的定义搞砸了。 k 是子串 减一 的长度,i 是 基于一的 索引。您假设 k 是子字符串的长度,而 i 是与开头的距离,但这不是它们的定义方式。
  • @Eric:那好吧。虽然这行得通,因为他保证为任何非空输入找到一个子字符串,但仍然建议 OP 使用正常的编程约定。

标签: c# c algorithm sequence


【解决方案1】:

其实这是应用于序列及其逆序的最长公共子字符串问题:http://en.wikipedia.org/wiki/Longest_common_substring_problem

这不同于最长公共子序列http://en.wikipedia.org/wiki/Subsequence#Substring_vs._subsequence

【讨论】:

  • @Potatoswatter:最长公共子串问题比较两个字符串以找到公共子串......我们如何将相同的原理应用于单个序列及其反向?请解释一下。
  • @iecut:将序列视为一个字符串,将其反向视为另一个字符串。将算法应用于这两个字符串。您可以在序列上向后迭代以获得第二个字符串。
  • @Potatoswatter 它不是最长的公共子串,因为他要求子序列,所以我们可以应用 LCS(只是改变比较)它变成 MCS(最小公共子序列)根据字符串上的问题和字符串的反转
【解决方案2】:

将最长公共子字符串应用于字符串及其反向。

 LCS ("abcdefgedcg", "gcdegfedcba") = "cde"

编辑:不是如potatoswatter指出的子序列,不是子序列。

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-04-14
    • 2016-07-17
    • 2012-12-11
    相关资源
    最近更新 更多