【问题标题】:Forming Palindrome from a String从字符串形成回文
【发布时间】:2015-04-25 17:48:03
【问题描述】:

我正在解决字符串问题中的最长回文,我们正在寻找形成回文的最长子字符串。我上面的代码是:

private static int palindrome(char[] ch, int i, int j) {
    // TODO Auto-generated method stub
    if (i == j)
        return 1;

    // Base Case 2: If there are only 2 characters and both are same
    if (ch[i] == ch[j] && i + 1 == j)
        return 2;

    // If the first and last characters match
    if (ch[i] == ch[j])
        return palindrome(ch, i + 1, j - 1) + 2;

    // If the first and last characters do not match
    return max(palindrome(ch, i, j - 1), palindrome(ch, i + 1, j));

}

现在,我很想知道,如果我们不是寻找最长的子字符串,而是创建一个回文,从字符串中选择随机字符(每个字符只有一个实例),但顺序与 String 中的相同。是否可以在多项式时间内做到这一点?

【问题讨论】:

  • 我不确定我是否理解你的问题。对于字符串“abcde”,您会生成回文“c”还是“abcdedcba”?
  • @RavindraHV 看到问题的最后一部分。我编辑了它。
  • 我假设你想要尽可能长的回文?
  • @maraca 正确的术语是子序列:en.wikipedia.org/wiki/Subsequence
  • 我认为这可以通过对字符串及其反向应用最长公共子序列算法来解决。

标签: java string algorithm palindrome


【解决方案1】:

这个问题可以通过应用Longest Common Subsequence algorithm (LCS)来解决。 LCS基本上解决了以下问题:

给定两个字符串ab,作为ab 的子序列的最长字符串c 是什么?

字符串的子序列是该字符串中按顺序排列的字符序列,允许跳过。

现在让我们看看您的问题。 我们想找到字符串x 的最长子序列,它是一个回文。 但是,根据定义,回文是一个向前和向后读取相同的字符串。 因此,相同的回文也将是x镜像的子序列。

让我们用字符串abca 来说明。 显然,它的两个最长回文子序列是abaacaabca 的镜像是acba。 它最长的回文子序列是什么?还有abaaca

所以我们现在可以使用 LCS 来解决您的问题,如下所示:

String longestPalindromicSubsequence(String x) {
    // Get the mirror image of x
    String y = mirror(x);
    return LCS(x,y);
}

LCS 可以在O(n^2) 时间内完成,其中n 是字符串的长度。 反转字符串需要线性时间,因此最终运行时间为O(n^2)

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2023-04-03
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多