首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的

1.最长公共子序列

1、最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题

2、同时,子问题的解释可以被重复使用的,也就是说更高级别的子问题会重用更小子问题的解

满足这两点以后,很容易就想到用动态规划来求解。

1.假设两个字符串s1, s2。当其中一个串的长度为0时,公共子序列的长度肯定为0。

2.假设s1的第i个字符与s2的第j个字符相等时,最长子序列等于s1的第i-1个字符与s2的第j-1个字符最长子序列长度+1。

3.假设s1的第i个字符与s2的第j个字符不相等时,最长子序列等于s1的第i个字符与s2的第j-1个字符最长子序列长度或s1的第i-1个字符与s2的第j个字符最

长子序列长度中最大那一个。

dp[i][j]表示s1的第i个字符与s2的第j-1个字符最长子序列长度

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int dp[][];
int len1,len2;
void lcs(string s1,string s2)
{
for(int i=;i<=len1;i++)//初始化
dp[i][]=;
for(int i=;i<=len2;i++)
dp[][i]=;
for(int i=;i<=len1;i++)
{
for(int j=;j<=len2;j++)
{
if(s1[i-]==s2[j-])
dp[i][j]=dp[i-][j-]+;
else
dp[i][j]=max(dp[i-][j],dp[i][j-]);
}
} }
void Print(string s1,string s2)//输出公共子序列
{
string str="";
while(len1>=&&len2>=)//从字符串s1,s2的末尾位置往前推
{
if(s1[len1-]==s2[len2-])
{
str=str+s1[len1-];
len1--;
len2--;
}
else
{
if(dp[len1][len2-]>dp[len1-][len2])//说明公共的字符在字符串s1的i位置之前,与字符s2[j]无关
len2--;
else
len1--;
}
}
for(int i=str.length();i>=;i--)
cout<<str[i]<<' ';
cout<<endl;
}
int main()
{
string s1,s2;
cin>>s1>>s2;
len1=s1.length();
len2=s2.length();
lcs(s1,s2);
cout<<dp[len1][len2]<<endl;
Print(s1,s2);
return ;
} // aaeefdhe
// saabcd //3
// a a d

2.最长公共子串

最长公共子串跟最长公共子序列的唯一区别在于,公共子串要求是连续的,子序列要求不一定连续。

具体的思路还是动态规划,不同点在于动态规划的迭代策略

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int dp[][];
int len1,len2;
int mx_len=,End=;//End是公共字串结束的位置
void lcs(string s1,string s2)
{
for(int i=;i<=len1;i++)//初始化
dp[i][]=;
for(int i=;i<=len2;i++)
dp[][i]=;
for(int i=;i<=len1;i++)
{
for(int j=;j<=len2;j++)
{
if(s1[i-]==s2[j-])
dp[i][j]=dp[i-][j-]+;
else
dp[i][j]=; if(dp[i][j]>mx_len)
{
mx_len=dp[i][j];
End=i-;
}
}
} } int main()
{
string s1,s2;
cin>>s1>>s2;
len1=s1.length();
len2=s2.length();
lcs(s1,s2);
cout<<mx_len<<endl;
for(int i=End-mx_len+;i<=End;i++)
cout<<s1[i];
cout<<endl;
return ;
} // aaeefdhe
// saabcd //2
//aa

最长公共子序列/子串 LCS(模板)的更多相关文章

  1. nyoj 36 最长公共子序列【LCS模板】

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  2. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  3. 最长公共子序列问题 (LCS)

    给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...

  4. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  5. 【Luogu P1439】最长公共子序列(LCS)

    Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...

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

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

  7. python 回溯法 子集树模板 系列 —— 14、最长公共子序列(LCS)

    问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog ...

  8. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

  9. P1439 【模板】最长公共子序列(LCS)

    先来看一看普通的最长公共子序列 给定字符串A和B,求他们的最长公共子序列 DP做法: 设f[i][j]表示A[1~i]和B[1~j]的最长公共子序列的长度 那么f[i][j]=max(f[i-1][j ...

随机推荐

  1. go基础_切片

    切片创建方式 1.通过数组创建 2.通过内置函数make创建 切片允许的操作 1.追加元素 2.通过内置函数make创建 package main import "fmt" fun ...

  2. Windows下配置Erlang环境

    1.下载地址 http://www.erlang.org/downloads 2.下载文件 下载 OTP 22.2 Windows 64-bit Binary File 3.配置环境变量 将下载的安装 ...

  3. Visual Studio Code打不开

    1.win+R 2.输入cmd 3.输入netsh winsock reset然后就可以打开了,如果依然打不开就重启电脑试试

  4. vue项目用npm安装sass包遇到的问题及解决办法

    IDEA启动vue程序,浏览器访问时出现如下情况的关于node-sass的错误: 错误1: Module build failed (from ./node_modules/sass-loader/d ...

  5. PHP固定长度字符串

    /** * 获取固定长度随机字符串 * @param $n * @return string * @throws Exception */ function gf_rand_str($n) { if ...

  6. Plastic Sprayers Manufacturer -Plastic Spray Bottle Product Features, Nozzle Properties

    Nowadays, plastic spray bottles are widely used in the plastic packaging industry. What are the char ...

  7. 今天启动项目的时候报了一个错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.

    从报错信息看应该是内存问题导致不能持久化到硬盘,在网上找到了一个解决方法: Redis被配置为保存数据库快照,但它目前不能持久化到硬盘.用来修改集合数据的命令不能用.请查看Redis日志的详细错误信息 ...

  8. 2_2 3n+1问题

    猜想:对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半.经过若干次这样的变换,一定会使n变为1.例如:3→10→5→16→8→4→2→1. 输入n,输出变换的次数.n< ...

  9. ThinkPHP3.2.2的函数扩展

    ThinkPHP的函数扩展:为了更好的在前台模板中显示变量,例如,商品分类中,分类名称之间的缩进.此时,在APP/Common/Common文件夹下(APP为新建的应用目录),新建一个php文件,如: ...

  10. idea 启动java项目报 java: 程序包org.apache.jasper.tagplugins.jstl.core不存在

    File -- Project Structure