我在一个String问题中解决了Longest Palindrome,我们正在寻找形成回文的最长子串。我的上述代码是:
$(document).ready(function() {
function setHeightParent() {
$("#Parent").css("height", $("#feed").height() + 250);
}
setTimeout(setHeightParent, 800)
});
现在,我很想知道如果不是找到最长的子字符串,而是从字符串中选择随机字符(每个字符只有一个实例)而不是字符串中的相同序列。是否可以在多项式时间内完成此操作?
答案 0 :(得分:3)
通过应用Longest Common Subsequence algorithm (LCS)可以解决此问题。 LCS基本上解决了以下问题:
鉴于两个字符串
a
和b
,c
和a
的子序列中最长的字符串b
是什么?
字符串的子序列是该字符串中的一系列字符,按顺序允许跳过。
现在让我们来看看你的问题。
我们希望找到作为回文的字符串x
的最长子序列。
但是,根据定义,回文是一个向前和向后读取相同的字符串。
因此,同样的回文也将是x
的镜像的子序列。
让我们用字符串abca
来说明。
显然,它的两个最长的回文子序列是aba
和aca
。
abca
的镜像是acba
。
它最长的回文序列是什么?还有aba
和aca
!
因此我们现在可以使用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)
。