题目

最长公共子序列

给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。

样例

给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1

给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2

注意
说明

最长公共子序列的定义:

  • 最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
  • https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

解题

最长上升子序列 求的都是最长,应该动态规划求解.画图下面的图,1 的位置就是相同的元素。从(0,1)开始是第一个相同的元素A,后面的设为(i,j)要想是后续连续的公共子序列则,i>0 j>1 也就是说,后面点的横纵坐标一定要大于前面点的横纵坐标。

  E A C B
A   1    
B       1
C     1  
D        

这样可以定义一个很大的数组,如何根据数组中1出现的位置找到最长的子序列,设这个数组是Arr

Arr[i][j] =1 表示元素相同 ,如何找出下一个点的横坐标大于i 纵坐标大于j的,并且一直找下去。。。下面不知道怎么办了。。。

维基百科 说得很好

设两个字符串是A、B ,其长度是lenA、lenB 定义数组Arr[lenA+1][lenB+1] ,Arr[i][j] 表示A[0--i] ,B[0--j] 两个字符串的最长公共子序列长度,对下面的一个位置 i+ 1 、j+ 1

1.若A[i+1] == B[j+1], 则Arr[i+1][j+1] = Arr[i][j] + 1

2.若A[i+1]!=B[j+1],Arr[i+1][j+1] 应该是根据其前面一个元素的值确定的,这里是个矩阵其前面的元素是Arr[i][j],Arr[i+1][j],Arr[i][j+1]

Arr[i][j]表示A[0--i] ,B[0--j] 两个字符串的最长公共子序列长度

Arr[i+1][j]表示A[0--i+1] ,B[0--j] 两个字符串的最长公共子序列长度

Arr[i][j+1]表示A[0--i] ,B[0--j+1] 两个字符串的最长公共子序列长度

A[i+1]!=B[j+1], 可能A[i+1]==B[j]  A[i]==B[j+1]  这里是交叉相等的情况所以Arr[i+1][j+1] =max(Arr[i+1][j],Arr[i][j+1])

同时要注意:数组Arr长度是lenA+1 lenB+1 第一行第一列的元素都是0 这样在求解的时候比较方便

Java

public class Solution {
/**
* @param A, B: Two strings.
* @return: The length of longest common subsequence of A and B.
*/
public int longestCommonSubsequence(String A, String B) {
// write your code here
int lenA = A.length();
int lenB = B.length();
if(A== null || B == null||lenA == 0|| lenB ==0)
return 0;
int d[][] = new int[lenA + 1][lenB + 1];
for(int i=1;i<= lenA;i++){
for(int j=1;j<=lenB;j++){
// if(i==0)
// d[i][j] = 0;
// if(j==0)
// d[i][j] = 0;
char a = A.charAt(i-1);
char b = B.charAt(j-1);
if(a ==b ){
d[i][j] = d[i-1][j-1] + 1;
}else{
d[i][j] = Math.max(d[i-1][j],d[i][j-1]);
}
}
}
return d[lenA][lenB];
}
}

Java Code

Python

class Solution:
"""
@param A, B: Two strings.
@return: The length of longest common subsequence of A and B.
"""
def longestCommonSubsequence(self, A, B):
# write your code here
if A == None or B==None or len(A) ==0 or len(B) == 0:
return 0
lenA = len(A)
lenB = len(B)
d = [[0 for i in range(lenB+1)] for j in range(lenA+1)]
for i in range(1,lenA+1):
for j in range(1,lenB+1):
if A[i-1] == B[j-1]:
d[i][j] = d[i-1][j-1] + 1
else:
d[i][j] = max(d[i-1][j],d[i][j-1])
return d[lenA][lenB]

递归求解超时

    public int longestCommonSubsequence(String A, String B) {
// write your code here
int lenA = A.length();
int lenB = B.length();
if(A== null || B == null||lenA == 0|| lenB ==0)
return 0;
char a = A.charAt(0);
char b = B.charAt(0);
if( a == b){
String subA = A.substring(1);
String subB = B.substring(1);
return 1 + longestCommonSubsequence(subA,subB);
}else{
String subA = A.substring(1);
String subB = B.substring(1);
int lcs1 = longestCommonSubsequence(A,subB);
int lcs2 = longestCommonSubsequence(subA,B);
return Math.max(lcs1,lcs2);
} }

lintcode:最长公共子序列的更多相关文章

  1. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  2. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

  3. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  4. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  5. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  6. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题

    先要搞明白:最长公共子串和最长公共子序列的区别.    最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...

  9. LCS(Longest Common Subsequence 最长公共子序列)

    最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

随机推荐

  1. MVC3+中 ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  2. Python实现Apriori

    Python实现Apriori 运行环境 Pyhton3 计算过程 st=>start: 开始 e=>end: 结束 op1=>operation: 读入数据 op2=>ope ...

  3. PB串口编程资料(转)

    ----MSCOMM32参数基本介绍2008年03月29日 星期六 上午 11:37MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串口编程时非常方便,程序 ...

  4. 微软职位内部推荐-Senior Software Development Engineer H/F

    微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...

  5. java 参数化类型

    package com.gxf.collection; import java.util.LinkedList; public class TestForT<T> { private Li ...

  6. (转载)HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截)

    原文: http://www.cppblog.com/biao/archive/2010/08/21/124196.html 当按下一个按钮时,想打开一个新的标签页,可以使用window.open去实 ...

  7. Xamarin.Android之转换,呼叫,查看历史纪录

    Xamarin.Android之转换,呼叫,查看历史纪录 E文文章. 功能:能将输入的字母转换成相应的数字.并且能呼叫出去.能查看呼叫的历史纪录. 界面代码如下: <?xml version=& ...

  8. hibernate.cfg.xml 配置(摘录)

    配置文件中映射元素详解 对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的 ...

  9. android 开发 system/app目录下面有多个重复包名的apk,会不会冲突

    环境:已经拥有了root权限的android系统,我们的apk是开机启动 测试:将2个相同的版本拷贝到系统system/app目录下面 adb root #获取root权限,前提是已经开放了root权 ...

  10. android开发 ,对接支付宝,服务器(PHP)校验失败

    已备忘记,资料链接: http://my.oschina.net/u/256646/blog/174222 注意: 里面有一个设计到支付宝公钥的地方: 注 意这个是2048位的公钥应该是9行或者10行 ...