博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCS问题
阅读量:6246 次
发布时间:2019-06-22

本文共 2203 字,大约阅读时间需要 7 分钟。

//动态规划(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循环,一直输出好多元素.....    }}

 

转载于:https://www.cnblogs.com/dengyt/p/6859917.html

你可能感兴趣的文章
高危漏洞预警:WordPress Core 多个高危漏洞
查看>>
《DNS与BIND(第5版)》——1.5 一定要使用DNS吗
查看>>
"挖掘机指数"告诉你不一样的中国经济
查看>>
看麦肯锡如何分析中国城市群
查看>>
《数据分析变革:大数据时代精准决策之道》一1.4 全面看待运营型分析
查看>>
一分钟自我介绍:阿里云CDN
查看>>
《iOS 8开发指南》——第6章,第6.5节实战演练——使用模板Single View Application...
查看>>
【观点】离开了信息化,大数据就是为他人作嫁衣
查看>>
《HTML5+CSS3网页设计入门必读》——1.4 分裂:WHATWG TF
查看>>
《JavaScript核心概念及实践》——第2章 基本概念 2.1 数据类型
查看>>
Linux有问必答:如何修复"fatal error: jsoncpp/json/json.h: No such file..."
查看>>
阿里数据库内核月报:2016年11月
查看>>
简单了解Disruptor(一)
查看>>
编写更好 Bash 脚本的 8 个建议
查看>>
Mavens实战 1.5小结
查看>>
《 硬件创业:从产品创意到成熟企业的成功路线图》——第1章 硬件创业概述 1.1 早期的创客们...
查看>>
《Android游戏开发详解》——第3章,第3.5节继承
查看>>
《Docker生产环境实践指南》——2.6 编排
查看>>
Docker学习(一)
查看>>
云端架美购,精品零距离
查看>>