`

java-56-动态规划-最长公共子序列

 
阅读更多
http://zhedahht.blog.163.com/blog/static/254111742007376431815/
http://blog.csdn.net/yysdsyl/article/details/4226630



import java.util.ArrayList;
import java.util.List;


public class LongestCommonSubsequence {

	/**
	 * Q 56 最长公共子序列
	 * 如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。
	 * 注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
	 * 请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 
	 * 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串
	 * 则输出它们的长度4,并打印任意一个子串。
	 * see http://zhedahht.blog.163.com/blog/static/254111742007376431815/
	 * see also http://blog.csdn.net/yysdsyl/article/details/4226630
	 */
	public static void main(String[] args) {
		LongestCommonSubsequence lcs=new LongestCommonSubsequence();
		String[] str={"BDCABA","ABCBDAB","abcd","ad"};
		//test "BDCABA","ABCBDAB"
		int length=lcs.findLCS(str[0],str[1]);
		System.out.println(length);
		System.out.println(lcs.list);
		
		lcs.list.clear();
		
		//test "abcd","ad"
		length=lcs.findLCS(str[2],str[3]);
		System.out.println(length);
		System.out.println(lcs.list);
	}

	/*
   		  /      0                               if i<0 or j<0 //case 1
c[i,j]=          c[i-1,j-1]+1                    if i,j>=0 and xi=xj //case 2
         \       max(c[i,j-1],c[i-1,j]           if i,j>=0 and xi≠xj //case 3
	 */
	public int findLCS(String strA,String strB){
		if(strA==null||strB==null){
			return 0;
		}
		int len1=strA.length();
		int len2=strB.length();
		if(len1==0||len2==0){
			return 0;
		}
		
		char[] lettersA=strA.toCharArray();
		char[] lettersB=strB.toCharArray();
		
		int[][] LCS_Length=new int[len1][len2];
		//'direction' records how lcs[i][j] come from.It's used to print LCS.
		Direction[][] direction=new Direction[len1][len2];
		
		for(int i=0;i<len1;i++){
			for(int j=0;j<len2;j++){
				if(i==0 || j==0){//case 1
					if(lettersA[i]==lettersB[j]){
						LCS_Length[i][j]=1;
						direction[i][j]=Direction.LeftUp;
					}else{
						if(i>0){
							LCS_Length[i][j]=LCS_Length[i-1][j];
							direction[i][j]=Direction.Up;
						}
						if(j>0){
							LCS_Length[i][j]=LCS_Length[i][j-1];
							direction[i][j]=Direction.Left;
						}
						
					}
				}else{
					if(lettersA[i]==lettersB[j]){//case 2
						LCS_Length[i][j]=LCS_Length[i-1][j-1]+1;
						direction[i][j]=Direction.LeftUp;
					}else{//case 3
						if(LCS_Length[i][j-1]>LCS_Length[i-1][j]){
							LCS_Length[i][j]=LCS_Length[i][j-1];
							direction[i][j]=Direction.Left;
						}else{
							LCS_Length[i][j]=LCS_Length[i-1][j];
							direction[i][j]=Direction.Up;
						}
					}
				}
			}
		}
		printLCS(direction,lettersA,lettersB,len1-1,len2-1);
		return LCS_Length[len1-1][len2-1];
	}
	
	private List<Character> list=new ArrayList<Character>();
	
	//from lcs[len-1][len-1] to lcs[0][0]
	public void printLCS(Direction[][] direction,char[] lettersA,char[] lettersB,int row,int col){
		if(lettersA==null||lettersB==null){
			return;
		}
		int len1=lettersA.length;
		int len2=lettersB.length;
		if(len1==0||len2==0||!(row<len1&&col<len2)){
			return;
		}
		if(direction[row][col]==Direction.LeftUp){
			if(row>0&&col>0){
				printLCS(direction,lettersA,lettersB,row-1,col-1);
			}
			list.add(lettersA[row]);
		}
		if(direction[row][col]==Direction.Left){
			if(col>0){
				printLCS(direction,lettersA,lettersB,row,col-1);
			}
		}
		if(direction[row][col]==Direction.Up){
			if(row>0){
				printLCS(direction,lettersA,lettersB,row-1,col);
			}
		}
		
	}
	
	public enum Direction{Up,Left,LeftUp};
}

  • 大小: 90.7 KB
分享到:
评论

相关推荐

    实验5--最长公共子序列 JAVA

    1. 掌握动态规划法的设计思想并能熟练运用 2. 强化动手编程的能力 二. 实验内容 用动态规划法求两个序列的最大公共子序列 三. 算法思想 1. 分析可得如下动态规划函数: ① L[0][0]=L[i][0]=L...

    java解决动态规划最长公共子序列问题

    最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中的一种经典问题,尤其在算法和数据结构领域有着广泛的应用。这个问题涉及到比较两个序列,找出它们的最长的子序列,这个子序列不需要在原序列中...

    LCS 最长公共子序列 JAVA

    最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要出现在序列比对、文本编辑距离等领域。在两个给定的字符串中,LCS是指不考虑字符顺序的最长子串,它同时存在于这两个字符...

    java-string-similarity, 各种字符串相似性和距离算法.zip

    java-string-similarity, 各种字符串相似性和距离算法 java-string-similarity 实现不同字符串相似度和距离... 目前已经实现了许多算法( 包括Levenshtein编辑距离和 sibblings,jaro winkler,最长公共子序列,余弦相

    Java动态规划求解最长公共子序列问题.zip

    最长公共子序列(Longest Common Subsequence,LCS)问题是一个经典的计算机科学问题,主要涉及字符串处理和算法设计。在两个或多个字符串中找到最长的子序列,这个子序列不必连续,但必须保持原字符串中的相对顺序...

    找出所有最长公共子序列算法代码

    所有最长公共子序列(LCS)——动态规划——Java---所有!!!所有!!!所有!!!

    Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

    Java中的动态规划法被广泛应用于解决复杂的问题,如求解最长公共子序列(Longest Common Subsequence, LCS)和最长公共子字符串(Longest Common Substring, LSS)。这两个概念在计算机科学中尤其是在字符串处理和...

    最长公共子序列

    【最长公共子序列】(Longest Common Subsequence, LCS) 是一种在计算机科学中常见的字符串比较问题,主要涉及序列和动态规划。这个问题的目标是找到两个给定字符串的最长子序列,这个子序列不必连续,但必须保持原...

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    本文将深入探讨这两个文件:"mysql-connector-java-5.1.40.zip" 和 "mysql-connector-java-5.1.10.jar",以及它们在Java开发中的作用。 首先,`mysql-connector-java-5.1.40.zip` 是一个压缩文件,包含了MySQL ...

    最长公共子序列LCS算法

    最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在文本编辑、生物信息学、数据挖掘等领域有着广泛的应用。LCS问题的基本目标是...

    aliyun-java-sdk

    RAM SDK 包含阿里云 Java SDK 公共部分和 RAM 部分,公共部分依赖aliyun-java-sdk-core, RAM 部分依赖aliyun-java-sdk-ram。 每个接口的详细使用方法请参考 RAM API 文档。 关于 SDK Demo 代码的自动生成和在线 ...

    mysql-connector-java-5.1.40.tar.gz

    "mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为5.1.40。这个压缩包包含了运行Java应用与MySQL数据库进行交互所需的类库和其他相关文件。 在Linux环境中处理这个压缩包,首先需要将...

    mysql-connector-java-5.1.45-bin.jar

    这个"mysql-connector-java-5.1.45-bin.jar"文件是该驱动的一个特定版本,即5.1.45版。这个版本是纯净且正版的,适合于Java开发者在他们的项目中直接集成使用。 在Java编程中,为了连接到MySQL数据库,我们需要一个...

    java-string-similarity

    各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度......

    mysql驱动包mysql-connector-java-5.1.7-bin.jar

    mysql-connector-java-5.1.7-bin.jar

    mysql-connector-java-commercial-5.1.30-bin.jar

    在C:\Program Files\Java目录下建立mysqlforjdbc子目录,进入该目录将mysql-connector-java-5.1.30-bin.jar到该目录下 进入C:\Program Files\Java\jdk1.7.0_04\lib目录将mysql-connector-java-5.1.30-bin-g.jar拷贝...

    最长公共子序列(LCS)算法源代码和实验报告

    最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在文本编辑、生物信息学、数据挖掘等领域有着广泛的应用。LCS的基本思想是寻找两...

    ckeditor-java-core-3.5.3

    此版本是"ckeditor-java-core-3.5.3",专门针对Java平台进行了优化,允许开发者在Java应用程序中集成CKEditor的功能。 1. **CKEditor简介** CKEditor是一款基于JavaScript的WYSIWYG(所见即所得)文本编辑器,最初...

    mysql-connector-java-8.0.18.jar

    这是MySQL最新的jar,mysql-connector-java-8.0.18.jar

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar

    mysql驱动包 mysql-connector-java-5.1.13-bin.jar 方便快捷获取。。。

Global site tag (gtag.js) - Google Analytics