给定一个字符串X和该字符串的反向,Y。 X和Y的最长公共序列总是回文吗?

时间:2016-12-03 19:32:41

标签: string algorithm lcs

我们的教授给了我们以下问题:

Input
   A sequence of characters X = x1, x2, ... ,xn
Output
   The length of the longest sub-sequence of X that is a palindrome

我的解决方案是:

 Take X and reverse it into the sequence Y = y1, y2, ... , yn
 Then perform LongestCommonSubsequence(X,Y)  

他给了我部分功劳并写道,

"The LCS of X and reverse X is not necessarily a palindrome."

但是我继续运行这个算法(顺便说一句,不是我的),用X和反向X,我得到的只是回文。

/**
 ** Java Program to implement Longest Common Subsequence Algorithm
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/** Class  LongestCommonSubsequence **/
public class  LongestCommonSubsequence
{    
/** function lcs **/
public String lcs(String str1, String str2)
{
    int l1 = str1.length();
    int l2 = str2.length();

    int[][] arr = new int[l1 + 1][l2 + 1];

    for (int i = l1 - 1; i >= 0; i--)
    {
        for (int j = l2 - 1; j >= 0; j--)
        {
            if (str1.charAt(i) == str2.charAt(j))
                arr[i][j] = arr[i + 1][j + 1] + 1;
            else 
                arr[i][j] = Math.max(arr[i + 1][j], arr[i][j + 1]);
        }
    }

    int i = 0, j = 0;
    StringBuffer sb = new StringBuffer();
    while (i < l1 && j < l2) 
    {
        if (str1.charAt(i) == str2.charAt(j)) 
        {
            sb.append(str1.charAt(i));
            i++;
            j++;
        }
        else if (arr[i + 1][j] >= arr[i][j + 1]) 
            i++;
        else
            j++;
    }
    return sb.toString();
}
}

我如何证明或证明X和X的最长公共子序列是或不是回文?

1 个答案:

答案 0 :(得分:1)

对于<head>,我们有X = 0,1,2,0,1,其中一个最长的子序列是Y = reverse(X) = 1,0,2,1,0。所以你的命题一般不成立。但是问题中给出的算法返回的LCS仍然可能是回文。在我的示例中,所有LCS-s的系统枚举如下所示:0,2,10,1,00,2,10,2,01,2,01,2,1 - 第一个LCS确实是一个回文。但我一般都无法证明。所以我认为实际上(教授和你)都是正确的:虽然可能有1,0,1X的LCS不是回文,但LCS的大多数(实际上是:直接)实现 - 算法总是返回reverse(X)X的回文。 (完全证据仍然缺失)