问题描述
我对这个问题和解决方案有疑问。给定三个序列a,b,c-我使用了查找每对(a,b),(b,c)和(c,a)中最长的公共子序列值的逻辑。然后找到三个中的最小值。应该给我们最长的公共子序列值。
我想知道为什么我的解决方案不够可靠?我使用的代码如下(在JAVA中)。
驱动程序代码:
int result1 = DynamicProgramming.longestCommonSequence(a,b);
int result2 = DynamicProgramming.longestCommonSequence(b,c);
int result3 = DynamicProgramming.longestCommonSequence(c,a);
int temp = Math.min(result1,result2);
System.out.println(Math.min(result3,temp));
程序逻辑:
public static int longestCommonSequence(int[] a,int[] b) {
int[][] aS = new int[a.length + 1][b.length + 1];
int tempAS;
for (int i = 0; i < aS.length; i++)
for (int j = 0; j < aS[0].length; j++) {
if (i == 0) {
aS[i][j] = j;
} else if (j == 0) {
aS[i][j] = i;
} else {
int ins = aS[i][j - 1] + 1;
int del = aS[i - 1][j] + 1;
int mat = aS[i - 1][j - 1];
tempAS = Math.min(ins,del);
if (a[i - 1] == b[j - 1])
aS[i][j] = Math.min(mat,tempAS);
else
aS[i][j] = tempAS;
}
}
return (a.length + b.length - aS[a.length][b.length]) / 2;
}
该程序在我尝试过的所有测试用例中均有效。但是,当我将其提交给在线自动测试仪时,它在最后一个测试用例(edx课程)上失败了。我无法想到解决方案将失败的情况。任何帮助将不胜感激。
我们可以假定所有输入值都是有效的整数,并且数组a,b,c不为空。
PS:我已经找到了通过所有测试的替代解决方案。但是我很好奇我逻辑上的缺陷。谢谢。
解决方法
如果字符串a是aaaaaaaabbbbbbb
并且字符串b是bbbbbbbbccccccc
,字符串c为ccccccccaaaaaaa
那么(a,b)有一个长度为7的公共子序列 和(b,c)具有长度为7的共同子序列 和(c,a)具有长度为7的公共子序列
但是所有3个子序列都有一个共同的子序列吗? (答案:不。。。所以只取3个成对比较中的最小值是一个想法)