题目

最长公共子序列

给出两个字符串,找到最长公共子序列(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. java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  2. [shell基础]——split命令

    测试文本 # cat name1.txt name1 alvin1 name2 alvin2 name3 alvin3 name4 alvin4 此时目录下就只有这个文件 # ls name1.txt ...

  3. AppDelegate中的方法解析

    // 当应用程序启动完毕的时候就会调用(系统自动调用) -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOp ...

  4. Mac nginx PCRE install ngnix

    1 下载:pcre-8.12.tar.gz ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre 2 sudo tar xvfz pcre-8.1 ...

  5. WPF——数据绑定(二)绑定方法—绑定本地对象

    注意:本人初学WPF,文中表达或技术性问题请勿见怪,欢迎指正,谢谢 标记拓展语法:绑定到本地对象 什么是绑定到本地对象,我个人理解就是实现UI层上两个或多个控件的相互关联,一个控件的状态改变,导致另一 ...

  6. Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  7. asp.net webservice 返回json数据乱码解决方法

    [WebMethod] public void QueryRiskNotice(string phone) { try { var data = _riskNoticeDal.QueryRiskNot ...

  8. Unity的物理引擎是如何实现碰撞的呢?

    物理引擎不允许两个碰撞器重叠,当两个或多个物体碰撞时,Unity会根 据他们的旋转速度计算碰撞效果.计算主要根据物体的碰撞器是静止的还 是动态的.物体是不移动的,例如,墙,地面,院子里的喷池等.动态物 ...

  9. float和CGFloat混用的风险

    一般意义上的混用是没有问题的, 比如 float x=5.0; (void)printNumber:(CGFloat)number; 当调用printNumber:x的时候是没有问题的 但是如果使用f ...

  10. Codeforces Round #249 (Div. 2) D. Special Grid 枚举

    题目链接: http://codeforces.com/contest/435/problem/D D. Special Grid time limit per test:4 secondsmemor ...