2
私たちの教授は、私たちに次のような問題を与えた:文字列Xとその文字列の逆であるYが与えられます。 XとYの最も長い共通シーケンスは常に回文であるか?
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の最も長い共通サブシーケンスが回文であるかどうかを証明するか、それとも反証することができますか?
このリンクは役立つかもしれません:http://wcipeg.com/wiki/Longest_palindromic_subsequence スポイラー:LCSは必ずしも** palindromeを出力しません。 –
@coproc私はTymurのリンクが反例を提供していると思います。http://wcipeg.com/wiki/Longest_palindromic_subsequence#LCS-based_approach –
@גלעדברקןok、right。それでも、私は、OPのLCSアルゴリズムは常に回文を返すと思います(私の答えも見てください)。 – coproc