为什么我的3个序列的最长公共子序列逻辑不健全?

问题描述

我对这个问题和解决方案有疑问。给定三个序列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个成对比较中的最小值是一个想法)