lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
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(最长公共子串)的更多相关文章
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)
分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...
- (最长公共子序列 暴力) Common Subsequence (poj 1458)
http://poj.org/problem?id=1458 Description A subsequence of a given sequence is the given sequence w ...
- 最长上升子序列 LIS(Longest Increasing Subsequence)
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…< ...
- C#LeetCode刷题之#594-最长和谐子序列(Longest Harmonious Subsequence)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3800 访问. 和谐数组是指一个数组里元素的最大值和最小值之间的差 ...
- 最长上升子序列(Longest increasing subsequence)
问题描述 对于一串数A={a1a2a3…an},它的子序列为S={s1s2s3…sn},满足{s1<s2<s3<…<sm}.求A的最长子序列的长度. 动态规划法 ...
- LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
随机推荐
- Mybatis学习笔记9 - 鉴别器discriminator
鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为. 示例如下: DeptmentMapper接口定义: package com.mybatis.dao ...
- Django自定义过滤器
1.首先在在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名只能是temp ...
- 牛客网Java刷题知识点之字节缓冲区练习之从A处复制文本文件到B处(BufferedReader、BufferedWriter)、复制文本文件的原理图解
不多说,直接上干货! CopyTextByBufTest.java package zhouls.bigdata.DataFeatureSelection.test; import java.io.B ...
- [Android]JsonObject解析
android和服务器进行交互的时候往往会有数据的传输,而数据中有一种类型就是Json型,这两天在研究API接口的问题,服务器返回的数据类型都是Json型的.例如: 1.接收到的json字符串分为两种 ...
- 用Java 8 Lambda表达式实现设计模式:命令模式
在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...
- javascript中的this使用场景
刚接触js不久时对this总是感到无比迷茫,以下是来自js设计模式与实践里的总结 this总是指向一个对象,有时指向全局对象,有时指向构造对象,有时指向DOM对象 1. 作为对象的方法调用 做为对象的 ...
- asp.net webForm也可以这样用Ajax -- My Ajax Framework [全屏看文]
对于asp.net WebForm项目,进行Ajax操作大概有三种方式:web服务(.asmx文件) , 一般处理程序(.ashx)和 一些Ajax控件. 对于.net提供的ajax控件,暂且不 ...
- js获取日期:前天、昨天、今天、明天、后天
前天,昨天,今天,明天,后天 <html> <head> <meta http-equiv="Content-Type" content=" ...
- Swift-表格
//1.创建表格 let tv = UITableView(frame: view.bounds, style: .Plain) //2.添加到视图 view.addSubview(tv) //3.注 ...
- 什么是NIO2
NIO2I/O发展历史Java1.0-1.3在Java的早期版本中,没有完整的I/O支持,在开发过程中需要解决以下问题:1)没有数据缓冲区或者NIO的通道概念,需要编程人员处理底层细节.2)I/O是受 ...