public class LCS
{
public static void main(String[] args)
{
String[] x = {"", "U","B", "S", "B", "T", "H", "C"};
String[] y = {"", "B", "U", "S", "A", "E", "T", "A", "C"};
int[][] b = getLength(x, y);
Display(b, x, x.length-1, y.length-1);
}
/*
* @param x
* @param y
* @return 返回一個記錄決定搜索的方向的數組
*/
public static int[][] getLength(String[] x, String[] y)
{
//這裏沒有把第一行第一列置爲0
int[][] b = new int[x.length][y.length];
int[][] c = new int[x.length][y.length];
for(int i=1; i<x.length; i++)
{
for(int j=1; j<y.length; j++)
{
//對應第一個性質
if( x[i] == y[j])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
//對應第二或者第三個性質
else if(c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 0;
}
//對應第二或者第三個性質
else
{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
return b;
}
//回溯的基本實現,採取遞歸的方式
public static void Display(int[][] b, String[] x, int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 1)
{
Display(b, x, i-1, j-1);
System.out.print(x[i]);
}
else if(b[i][j] == 0)
{
Display(b, x, i-1, j);
}
else if(b[i][j] == -1)
{
Display(b, x, i, j-1);
}
}
}