最长公共子序列问题
2016-04-23 17:21
204 查看
输入:两个字符串序列
输出:两个字符串序列的最长公共子序列的长度和子序列
例如:
输入:str1="BDCABA", str2="ABCBDAB"
输出:4 “BDAB”
若此问题采用暴力法求解:枚举str1的每个子序列str,检查str是否为序列str2的子序列,记录当前找到的长度的最大的公共子序列。可以看出暴力法的效率十分低下,并且每次检查str是否为str2的子序列的时间复杂度为O(n),然而str有2m 个子序列,因此采用暴力法的最坏时间复杂度为O(n2m)。
针对此问题可以采用动态规划去做。
令C[i,j]表示str1的前i项和str2的前j项的最长公共子序列的长度,则会有
View Code
输出为:
第一个字符串str1为:BDCABA
第二个字符串str2为:ABCBDAB
最长公共子序列的长度为:4
最长公共子序列为:BDAB
输出:两个字符串序列的最长公共子序列的长度和子序列
例如:
输入:str1="BDCABA", str2="ABCBDAB"
输出:4 “BDAB”
若此问题采用暴力法求解:枚举str1的每个子序列str,检查str是否为序列str2的子序列,记录当前找到的长度的最大的公共子序列。可以看出暴力法的效率十分低下,并且每次检查str是否为str2的子序列的时间复杂度为O(n),然而str有2m 个子序列,因此采用暴力法的最坏时间复杂度为O(n2m)。
针对此问题可以采用动态规划去做。
令C[i,j]表示str1的前i项和str2的前j项的最长公共子序列的长度,则会有
public class LcsLength { public static int lcslength(String str1,String str2,char b[][]){ int m=str1.length(); int n=str2.length(); int c[][]=new int[m+1][n+1]; //统计长度 for(int i=0;i<=m;i++)c[i][0]=0; for(int j=0;j<=n;j++)c[0][j]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(str1.charAt(i-1)==str2.charAt(j-1)){c[i][j]=c[i-1][j-1]+1;b[i][j]='X';} //X表示左上箭头 else if(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]='U';} //U表示向上箭头 else {c[i][j]=c[i][j-1];b[i][j]='L';} //L表示向左箭头 return c[m] ; //返回最长子序列的长度 } public static void lcsprint(char B[][],String str1,int m,int n){ if(m==0||n==0)return; if(B[m] =='X'){lcsprint(B,str1,m-1,n-1);System.out.print(str1.charAt(m-1));} else if(B[m] =='U')lcsprint(B,str1,m-1,n); else lcsprint(B,str1,m,n-1); } public static void main(String[] args) { // TODO 自动生成的方法存根 String str1 = new String("BDCABA"); String str2 = new String("ABCBDAB"); System.out.println("第一个字符串str1为:"+str1); System.out.println("第二个字符串str2为:"+str2); int m=str1.length(); int n=str2.length(); char B[][]=new char[m+1][n+1]; System.out.println("最长公共子序列的长度为:"+lcslength(str1,str2,B)); System.out.print("最长公共子序列为:"); lcsprint(B,str1,m,n); } }
View Code
输出为:
第一个字符串str1为:BDCABA
第二个字符串str2为:ABCBDAB
最长公共子序列的长度为:4
最长公共子序列为:BDAB
相关文章推荐
- MySQL 数据库 练习题
- 编程之美精确表达浮点数
- 工厂模式
- MySQL 数据库 常用函数
- 使用TexturePackerGUI配合NGUI打包图集
- 中外饮食类英语单词大全
- 背包问题-堆栈-找出其中一组解(总体积为T,n件物品体积分别是w1,w2,...,w2n,找出若干件恰好装满背包)
- Android Services 创建一个Bound服务
- 团队开发——个人工作总结05
- 全局侧滑
- 欢迎使用CSDN-markdown编辑器
- Eclipse下Genymotion模拟器的安装
- 有赞搜索引擎实践(算法篇)
- ArcGIS Desktop 高(新)版本数据库迁移到较低(旧)版本数据库操作方法
- Less函数说明
- 343. Integer Break 【M】
- 【BZOJ1194】[HNOI2006]潘多拉的盒子【BFS】【SCC】【拓扑排序】【DAG最长路】【自动机】
- Exchange 2016集成ADRMS系列-12:域内outlook 2010客户端测试
- 开源新闻速递(160423):Ubuntu 16.04 各个主要分支发布,有的分支面临消亡
- 第九周项目1—深复制体验(2)