string - 搜索满足某些条件的最小字符串

标签 string dynamic-programming subsequence

最近,我在面试时被问到以下问题。

给定一个字符串 S,我需要找到另一个字符串 S2,使得 S2 是 S 的子序列,并且 S 也是 S2+reverse(S2) 的子序列。这里的“+”表示连接。我需要为给定的 S 输出 S2 的最小可能长度。

有人告诉我这是一个动态规划问题,但我无法解决它。有人可以帮我解决这个问题吗?

编辑-

有没有办法在 O(N2) 或更少的时间内做到这一点。

最佳答案

这个问题有两个重要方面。

  • 由于我们需要 S 作为 S2+reverse(S2) 的子串,S2 应该有
    至少 n/2 长度。
  • 在 S2 和 reverse(S2) 串联后,有一个模式,其中
    字母重复,如

  • enter image description here

    所以解决方案是检查从 S 的中心到 S 的末尾是否有任何连续的元素。如果您找到一个,请检查任一侧的元素,如图所示。

    enter image description here

    现在,如果您能够到达字符串的末尾,那么最小元素数(结果)是从起点到您找到连续元素的点的距离。在这个例子中,它的 C 即 3。

    我们知道这可能不会总是发生。即您可能无法在中心找到连续的元素。假设连续的元素在中心之后,那么我们可以做同样的测试。

    主弦

    enter image description here

    子串

    enter image description here

    连接字符串

    enter image description here

    现在到了主要的疑问。为什么我们只考虑从中心开始的左侧?答案很简单,串联的字符串是由 S+reverse(S) 组成的。所以我们确定子字符串中的最后一个元素在连接的字符串中是连续的。主字符串前半部分的任何重复都无法给出更好的结果,因为至少我们应该在最终连接的字符串中有 n 个字母

    现在是复杂的问题:
    搜索连续字母给出最大 O(n)
    现在迭代地检查任一侧的元素可以给出 O(n) 的最坏情况复杂度。即最多 n/2 次比较。
    我们可能会在第二次检查中失败很多次,所以我们在复杂性之间有一个乘法关系,即 O(n*n)。

    我相信这是一个正确的解决方案,还没有发现任何漏洞。

    关于string - 搜索满足某些条件的最小字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898848/

    相关文章:

    c - 替换字符串中的单词

    java - 越界异常(字符串)

    dynamic-programming - 0/1 最低成本的背包

    C++ 多个 cin.get()

    ios - 快速从字符串中剥 ionic 字符串

    algorithm - 为什么带缓存的优化斐波那契被描述为自上而下的解决方案?

    c - O(n) 中各点的绝对距离

    python - 生成所有唯一的 k 子序列

    c - 求和在给定范围内的数组中的连续子序列数的递归函数

    algorithm - 存储为字符串的数字的所有子序列的总和