Java 使用递归列表的最长公共子序列
我试图找出两个可比较类型的事物之间最长的公共子序列。我已经完成了算法,但是我可以通过递归方法调用将这些项添加到列表中,但是我不知道如何以这种方式将最后一项添加到列表中 这是我的密码:Java 使用递归列表的最长公共子序列,java,algorithm,dynamic-programming,longest-substring,Java,Algorithm,Dynamic Programming,Longest Substring,我试图找出两个可比较类型的事物之间最长的公共子序列。我已经完成了算法,但是我可以通过递归方法调用将这些项添加到列表中,但是我不知道如何以这种方式将最后一项添加到列表中 这是我的密码: public static <E extends Comparable<E>>List<E> getLongestCommonSubSeq( List<E> x, List<E> y ) { int m = x.size() +1;
public static <E extends Comparable<E>>List<E> getLongestCommonSubSeq(
List<E> x,
List<E> y )
{
int m = x.size() +1;
int n = y.size() +1;
String[][] b =new String [m][n];
int[][] c = new int[m][n];
for(int i=1;i<m;i++) {
c[i][0] = 0;
}
for(int j = 0;j<n;j++) {
c[0][j]= 0;
}
for(int i=1; i<m;i++) {
for(int j=1;j<n;j++) {
if(x.get(i).equals(y.get(j))) {
c[i][j] = c[i-1][j-1]+1;
b[i][j]="NW";
}
else if(c[i-1][j] >= c[i][j-1]) {
c[i][j]=c[i-1][j];
b[i][j]="N";
}
else {
c[i][j] = c[i][j-1];
b[i][j]= "W";
}
}
}
return getLCS( m,n, b, x );
}
public static <E extends Comparable<E>> List<E> getLCS(
int i,
int j,
String[][] b,
List<E> x )
{
if(i==0 || j ==0)
return null;
if(b[i][j].equals("NW")) {
// This can't be done because add returns a boolean type
return getLCS(i-1,j-1, b, x) .add(x.get(i));
}
if(b[i][j].equals("N")) {
return getLCS(i-1,j, b, x);
}
if(b[i][j].equals("W")) {
return getLCS(i, j-1, b, x);
}
return null;
}
公共静态列表getLongestCommonSubSeq(
列表x,
列表(y)
{
int m=x.size()+1;
int n=y.大小()+1;
字符串[][]b=新字符串[m][n];
int[][]c=新的int[m][n];
对于(inti=1;i公共静态列表getLCS)(inti,intj,字符串[][]b,列表x){
List ret=new ArrayList();
如果(i==0 | | j==0)
返回ret;
如果(b[i][j].等于(“NW”)){
//无法执行此操作,因为add返回布尔类型
ret=getLCS(i-1,j-1,b,x);
ret.add(x.get(i));
}else如果(b[i][j].等于(“N”)){
ret=getLCS(i-1,j,b,x);
}else如果(b[i][j].等于(“W”)){
ret=getLCS(i,j-1,b,x);
}
返回ret;
}
我实施的有点错误
public static <E extends Comparable<E>>List<E> getLCS(int i, int j, String[][] b, List<E> x){
List<E> ret = new ArrayList<E>();
if(i==0 || j ==0)
return ret;
if(b[i][j].equals("NW")) {
// This can't be done because add returns a boolean type
ret=getLCS(i-1,j-1, b, x);
ret.add(x.get(i));
}else if(b[i][j].equals("N")) {
ret = getLCS(i-1,j, b, x);
}else if(b[i][j].equals("W")) {
ret= getLCS(i, j-1, b, x);
}
return ret;
}