java - 从字符串形成回文

标签 java string algorithm palindrome

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

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 中的顺序相同,则创建一个回文。是否可以在多项式时间内完成此操作?

最佳答案

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

Given two strings a and b, what is the longest string c that is a subsequence of both a and 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)

关于java - 从字符串形成回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868641/

相关文章:

java - 组织 Java 代码的最佳方式......多个项目或按包分开?

intellij Idea中的Java代码格式化(链式方法调用)

java - 保留特殊字符的replaceAll类型方法

c++ - 就地随机选择算法

c++ - 在排序和旋转的数组中搜索

算法:找到包含整个域的最少集合数

java - 需要帮助使用 webdriver 和 java 识别灯箱上的控件

java - 为什么 Map 不是 "true"集合?

javascript - 在 JavaScript 中多次重复一个字符串

string - 如何在字符串 : Swift IOS 中最后一次出现字符后获取子字符串