从一个字符串形成回文

时间:2015-04-25 17:48:04

标签: java string algorithm palindrome

我在一个String问题中解决了Longest Palindrome,我们正在寻找形成回文的最长子串。我的上述代码是:

$(document).ready(function() {
    function setHeightParent() {
        $("#Parent").css("height", $("#feed").height() + 250);
    }
setTimeout(setHeightParent, 800)
});

现在,我很想知道如果不是找到最长的子字符串,而是从字符串中选择随机字符(每个字符只有一个实例)而不是字符串中的相同序列。是否可以在多项式时间内完成此操作?

1 个答案:

答案 0 :(得分:3)

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

  

鉴于两个字符串abca的子序列中最长的字符串b是什么?

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

现在让我们来看看你的问题。 我们希望找到作为回文的字符串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)