Java算法5--最長公共子序列

一、需求

1、編寫用動態規劃算法求解最長公共子序列的類。

二、實現最長公共子序列源代碼

1、算法實現類

public class LCS {
    //計算LCS的長度
    public int LCSLength(char[] x,char[]y,int[][]b)
    {
        int m=x.length-1;
        int n=y.length-1;
        int[][]c=new int[m+1][n+1];
        for(int i=1;i<=m;i++)
            {
               c[i][0]=0;
            }
        for(int i=1;i<=n;i++)
            {
               c[0][i]=0;
            }
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++){
                if(x[i]==y[j])
                {
                    c[i][j]=c[i-1][j-1]+1;
                    b[i][j]=1;
                }
                else if(c[i-1][j]>=c[i][j-1])
                {
                    c[i][j]=c[i-1][j];
                    b[i][j]=2;
                }
                else
                {
                    c[i][j]=c[i][j-1];
                    b[i][j]=3;
                    }
                }
        return c[m][n];
    }
//計算LCS的最有長度
    public static void getLCS(int i,int j,char[]x,int[][]b)
    {
        if(i==0||j==0)
        {
            return;
        }
        if(b[i][j]==1)
        {
            getLCS(i-1,j-1,x,b);
            System.out.print(x[i]);
            System.out.print(",");
        }
        else if(b[i][j]==2)
        {
            getLCS(i-1,j,x,b);
        }
        else
        {
            getLCS(i,j-1,x,b);
        }
    }

}

2、測試類

//測試類
public class LCSTest {
    public static void main(String agrs[])
    {
        char []x={'c','B','C','2',',','/','w','B','C','A','D','C','1','G'};
        char []y={'A','B','k','2','.','/','r','K','C','B','Y','2','1','A'};
        int[][] b = new int [x.length+1][y.length+1];
        LCS s=new LCS();
        int c=s.LCSLength(x,y,b);
        System.out.print("X序列:");
        for(int i=0;i<x.length;i++)
        {
            System.out.print(x[i]);
        }
        System.out.println();
        System.out.print("Y序列:");
        for(int j=0;j<y.length;j++)
        {
            System.out.print(y[j]);
        }
        System.out.println();
        System.out.print("X、Y序列中最長公共子序列是:");
        LCS.getLCS(x.length-1,y.length-1,x,b);
        System.out.println();
        System.out.println("其長度是: "+c);
    }

}

這裏寫圖片描述

發佈了81 篇原創文章 · 獲贊 141 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章