Longest Common Subsequence最长公共子序列:

每个dp位置表示的是第i、j个字母的最长公共子序列

class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int len1 = A.size();
int len2 = B.size();
if(len1 == || len2 == )
return ; vector<vector<int>> result(len1+,vector<int>(len2+));
for(int i = ;i <= len1;i++){          //第一行第一列都为0,因为第一行第一列都没有字符串
result[i][] = ;
}
for(int i = ;i <= len2;i++){
result[][i] = ;
}
for(int i = ;i <= len1;i++){
for(int j = ;j <= len2;j++){
if(A[i-] == B[j-])
result[i][j] = result[i-][j-] + ;
else
result[i][j] = max(result[i-][j],result[i][j-]);
}
}
return result[len1][len2];
}
};

Longest Common Substring最长公共子串

每个dp代表以i、j这个坐标的最长公共子串,所以求最终的要遍历所有的

class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int len1 = A.size();
int len2 = B.size();
if(len1 == || len2 == )
return ; vector<vector<int>> result(len1+,vector<int>(len2+));
for(int i = ;i <= len1;i++){            //第一行第一列都为0
result[i][] = ;
}
for(int i = ;i <= len2;i++){
result[][i] = ;
}
for(int i = ;i <= len1;i++){
for(int j = ;j <= len2;j++){
if(A[i-] == B[j-])
result[i][j] = result[i-][j-] + ;
else
result[i][j] = ;
}
}
int maxnum = 0x80000000;
for(int i = ;i <= len1;i++){
for(int j = ;j <= len2;j++){
if(result[i][j] > maxnum)
maxnum = result[i][j];
}
}
return maxnum;
}
};

更简洁的一种写法:

class Solution {
public:
/**
* @param A: A string
* @param B: A string
* @return: the length of the longest common substring.
*/
int longestCommonSubstring(string &A, string &B) {
// write your code here
int m = A.size();
int n = B.size();
vector<vector<int> > dp(m+,vector<int>(n+));
for(int i = ;i <= m;i++)
dp[i][] = ;
for(int i = ;i <= n;i++)
dp[][i] = ;
int max_num = ;
for(int i = ;i <= m;i++){
for(int j = ;j <= n;j++){
if(A[i-] == B[j-]){
dp[i][j] = dp[i-][j-] + ;
max_num = max(max_num,dp[i][j]);
}
else
dp[i][j] = ;
}
}
return max_num;
}
};

相同:都要建立m+1,n+1的二维数组

区别:1. 最长公共子串要求连续的,最长公共子序列可以不连续,所以dp的递推公式第二项不同

   2. 最长公共子序列最后一个值就是最长,最长公共子串要比较哪个位置最长

lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)的更多相关文章

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

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

  2. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

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

    分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...

  4. (最长公共子序列 暴力) Common Subsequence (poj 1458)

    http://poj.org/problem?id=1458 Description A subsequence of a given sequence is the given sequence w ...

  5. 最长上升子序列 LIS(Longest Increasing Subsequence)

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...

  6. C#LeetCode刷题之#594-最长和谐子序列​​​​​​​​​​​​​​(Longest Harmonious Subsequence)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3800 访问. 和谐数组是指一个数组里元素的最大值和最小值之间的差 ...

  7. 最长上升子序列(Longest increasing subsequence)

    问题描述        对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足{s1<s2<s3<…<sm}.求A的最长子序列的长度. 动态规划法 ...

  8. LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)

    题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...

  9. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  10. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

随机推荐

  1. connect to 10.104.11.128 port 9999 (tcp) failed: No route to host

    问题: iptables当找到匹配的规则时,就会执行相应的动作,而不会向下继续匹配. 可以看到https没有添加,匹配不到规则,所以就会包错 解决方法: iptables -I INPUT -p tc ...

  2. linux 6 查看防火墙状态及开启关闭命令

    linux 6 查看防火墙状态及开启关闭命令 https://blog.csdn.net/lv_shijun/article/details/52453882 存在以下两种方式: 一.service方 ...

  3. 使用nrm解决npm下载包慢的问题!

    nrm的安装使用 作用:提供了一些最常用的NPM包镜像地址,能够让我们快速的切换安装包时候的服务器地址: 什么是镜像:原来包刚一开始是只存在于国外的NPM服务器,但是由于网络原因,经常访问不到,这时候 ...

  4. STL中的算法

    STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...

  5. HBase 的Get(读),Put(写),Delete(删),Scan(扫描)和Increment(列值递增)

    一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...

  6. MVCC(Multi-Version Concurrency Control)多版本并发控制机

    MVCC(Multi-Version Concurrency Control)是一种多版本并发控制机制.

  7. python 层次索引交换级别以及排序问题

  8. 远程调用历史及代码编写demo

    历史介绍部分: 远程调用大致经过了corba.webservice.二进制跟restful四个阶段 corba时代,corba(Common Object Request Broker Archite ...

  9. php锁定文本框内容的方法

    有时候我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如<input type="text" name="zg" value="中国& ...

  10. DEDE列表页和内容页调用顶级栏目ID的方法

    dede模板中添加顶级栏目id的方法总结,使用dede顶级栏目id可以实现很多功能.比如,在每个列表页调用不同的栏目图片(同一顶级栏目调用相同的图片),如果我们做N个栏目就意味着要做N个列表页模板,显 ...