最长公共子序列 递归

private static int recursion(char[] charsA, char[] charsB, int i, int j) {

 

        int iMax = charsA.length - 1;

        int jMax = charsB.length - 1;

        三种递归结束条件

        i,j都到达了字符串末尾

        if(i== iMax && j==jMax){

            return charsA[i]==charsB[j]?1:0;

        }

       i到达了字符串末尾,只有j能加1了

       if(i==iMax){

            if(charsA[i] == charsB[j]){

                return 1;

            }else {

                return recursion(charsA,charsB,i,j+1);

            }

        }

      j到达了字符串末尾,只有i才能往后移动了

      if(j==jMax){

            if(charsA[i] == charsB[j]){

                return 1;

            }else {

                return recursion(charsA,charsB,i+1,j);

            }

        }

            普遍情况:i和j都没有到达字符串末尾

            跳过j位置,让i位置和j+1位置的字符比较

            int p1 = recursion(charsA,charsB,i,j+1);

            跳过i位置

            int p2 = recursion(charsA,charsB,i+1,j);

            比较i位置和j位置的字符

            如果相等,结果加1,继续比较i+1和j+1

            如果不等,该情况可转化为上面两种情况,直接赋值为0

赋值0保证了p3不会超过p1/p2

            int p3 = charsA[i]==charsB[j]?(1+recursion(charsA,charsB,i+1,j+1)):0;

            return Math.max(p1,Math.max(p2,p3));

        

 

    }

 

 

 

你可能感兴趣的:(算法)