• LCS问题


    //动态规划(Dynamic programming)的最长公共子序列问题(Longest common subsequence)
    //原理参考《算法导论》书
    import java.util.Scanner;
    
    public class LCS {
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            String s1=sc.nextLine();
            String s2=sc.nextLine();
            int len1=s1.length();
            int len2=s2.length();
            int c[][]=new int[len1+1][len2+1];
            int b[][]=new int[len1+1][len2+1];
            for(int i=0;i<=len1;i++){
                for(int j=0;j<=len2;j++){
                    if(i==0||j==0){
                        c[i][j]=0;
                    }else if(s1.charAt(i-1)==s2.charAt(j-1)){
                        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;//表示←
                    }
                }
            }
            //直接输出表c,c[i,j]表示Xi和Yj的LCS的长度
            /*
            for(int i=0;i<=len1;i++){
                for(int j=0;j<=len2;j++){
                    System.out.print(c[i][j]+" ");
                }
                System.out.println();
            }
            */
            
            //直接输出表b,b[i,j]表示子问题最优解的指向
            /*
            for(int i=0;i<=len1;i++){
                for(int j=0;j<=len2;j++){
                    System.out.print(b[i][j]+" ");
                }
                System.out.println();
            }
            */
            
            System.out.println(c[len1][len2]);
            printLCS(b,s1,len1,len2);//调用方法printLCS,打印LCS的元素
            sc.close();
        }
        
        /**
         * 封装一个方法,打印LCS的元素(利用递归过程,逆序依次打印)
         * @param b 子问题最优解的指向
         * @param str 一个输入序列X
         * @param m 输入序列X的长度
         * @param n 输入序列Y的长度
         */
        public static void printLCS(int b[][],String str,int m,int n){
                    if(m==0||n==0){
                        return;
                    }
                    if(b[m][n]==1){
                        printLCS(b,str,m-1,n-1);
                        System.out.print(str.charAt(m-1)+" ");
                    }else if(b[m][n]==2){
                        printLCS(b,str,m-1,n);
                    }else{
                        printLCS(b,str,m,n-1);
                    }//直接用递归,之前用了for循环,一直输出好多元素.....
        }
    }
  • 相关阅读:
    du
    date
    echo
    redis的多实例
    redis相关配置
    mariadb的安装与主从复制
    11.Flask-钩子函数
    Python之Linux下的virtualenv&&virtualenvwrapper
    Linux的防火墙概念
    安装ipython解释器
  • 原文地址:https://www.cnblogs.com/dengyt/p/6859917.html
Copyright © 2020-2023  润新知