Самая длинная общая подпоследовательность printdDiff
Просто быстрый вопрос о самом длинном алгоритме Common subsequence. Я выполнил ту часть, в которой вам нужно создать подпоследовательность, следующим образом:
public int[][] lcsLength(char[] input1, char[] input2) {
int[][] opt = new int[M][N];
for (int i = 1; i < input1.length; i++) {
for (int j = 1; j < input2.length; j++) {
if (input1[i] == input2[j]) {
opt[i][j] = opt[i - 1][j - 1] + 1;
} else {
opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]);
}
}
}
return opt;
}
и функция printDiff следующим образом:
private static void printDiff(int[][] opt,String x,String y,int i, int j) {
if(i>0 &&j>0 && x.charAt(i-1)==y.charAt(j-1)){
printDiff(i-1,j-1);
System.out.println(x.charAt(i-1));
}
else{
if(j>0&&(i==0||opt[i][j-1]>=opt[i-1][j])){
printDiff(i-1,j-1);
System.out.println("-"+y.charAt(j-1));
}
else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){
printDiff(i-1,j-1);
System.out.println(x.charAt(i-1));
}
}
}
И тогда, если я буду использовать это в качестве параметров:
String input1="ABCDE"
String input2="ACDC"
int i=input1.length()
int j=input2.length()
после генерации матрицы opt с помощью lcsLength() мне бы хотелось, чтобы printdiff woul дал мне:
ABCDE-
A-CD-C
но вместо этого я получаю:
ABCDE-
ABCD-C
любые идеи о том, что я сделал неправильно, очень мне помогут
Спасибо Лоран
2 ответа
Не знаю, связано ли это с проблемой, но я думаю, что ваш код LCS должен быть:
public int[][] lcsLength(char[] input1, char[] input2) {
int[][] opt = new int[input1.length+1][input2.length+1];
for (int i = 1; i <= input1.length; i++) {
for (int j = 1; j <= input2.length; j++) {
if (input1[i-1] == input2[j-1]) {
opt[i][j] = opt[i - 1][j - 1] + 1;
} else {
opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]);
}
}
}
return opt;
}
Из вики:
function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j)
if i > 0 and j > 0 and X[i] = Y[j]
printDiff(C, X, Y, i-1, j-1)
print " " + X[i]
else if j > 0 and (i = 0 or C[i,j-1] ≥ C[i-1,j])
printDiff(C, X, Y, i, j-1)
print "+ " + Y[j]
else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j])
printDiff(C, X, Y, i-1, j)
print "- " + X[i]
else
print ""
Эта строка:
else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){
Должно быть:
else if(i>0&&(j==0|| opt[i][j-1]<opt[i-1][j])){
(менять <=
чтобы просто <
)