(五)最长公共子序列

136 阅读1分钟

算法导论实验(五)源码:

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {

        int n=text1.length(),m=text2.length();

        char[][] mark=new char[n+1][m+1];

        int[][] dp=new int[n+1][m+1];

        for(int i=1;i<=n;i++)

            for(int j=1;j<=m;j++){

                if(text1.charAt(i-1)==text2.charAt(j-1)){

                    dp[i][j]=dp[i-1][j-1]+1;

                    mark[i][j]='↖';

                }else if(dp[i-1][j]>=dp[i][j-1]){

                    dp[i][j]=dp[i-1][j];

                    mark[i][j]='↑';

                }else{

                     dp[i][j]=dp[i][j-1];

                     mark[i][j]='←';

                }

            }

        printLcs(mark,text1,n,m);

        return dp[n][m];

    }

    public void printLcs(char[][] mark,String text1,int i,int j){

        if(i==0||j==0)

            return;

        if(mark[i][j]=='↖')

        {

            printLcs(mark,text1,i-1,j-1);

            System.out.print(text1.charAt(i-1));

        }else if(mark[i][j]=='↑'){

            printLcs(mark,text1,i-1,j);

        }else{

            printLcs(mark,text1,i,j-1);

        }

    }

}