Longest Common Substring($LCS$)
Longest Common Substring(\(LCS\))
什么是子序列?
子序列就是某一个序列的不连续的一部分.
如图, \(abcde\)就是图中序列的一个子序列。

公共子序列
公共子序列的定义就是两个序列共有的子序列啦. qwq
一些题目就会要求我们求两个序列的最长公共子序列。
如果直接去两两比对的话,复杂度爆炸!
所以介绍\(O(n\times m)\)做法.
\(Dp\)
我们设\(f[i][j]\)代表从到达\(a\)串第\(i\)个位置,\(b\)串第\(j\)个位置的最长公共子序列的长度.
如何状态转移?
我们发现,如果要使我们的公共子序列的长度加长,必须要有的条件为\(a[i]==b[j]\)
因此,存在两种情况.
一. \(a[i]==a[j]\)
状态转移方程
\]
这时直接继承上一个情况即可.
二.\(a[i]!=a[j]\)
此时需要考虑的是,我们依旧要进行状态的传递.
当前\(f[i][j]\)需要继承上一状态取到\(max\)。
那这里的上一状态是什么?
我们可以知道的是,\(i-1\)位置与\(j\)位置已经有解,\(i\)位置与\(j-1\)位置已经有解。
如何去做?当前位置继承可以选择的状态也就是上面两种状态.
因此状态转移方程为
\]
这样为什么正确?
我们当前位置为\(a\)串\(i\)和\(b\)串\(j\),最长公共子序列可能是\(a\)串\(i-1\)位置与\(b\)串\(j\)位置结合,
状态转移方程
\]
由于当前位置\(i\)的状态只会与上一位置\(i-1\)有关,因此我们可以滚动数组.
滚动数组就不多BB了 emmm,
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#define R register
using namespace std;
char a[5008],b[5008];
int lena,lenb;
int f[2][5008];
int main()
{
scanf("%s%s",a+1,b+1);
lena=strlen(a+1);
lenb=strlen(b+1);
for(R int i=1;i<=lena;i++)
{
int op=i&1;
for(R int j=1;j<=lenb;j++)
{
if(a[i]==b[j])
f[op][j]=f[op^1][j-1]+1;
else
f[op][j]=max(f[op^1][j],f[op][j-1]);
}
}
printf("%d",f[lena&1][lenb]);
return 0;
}
Longest Common Substring($LCS$)的更多相关文章
- LintCode Longest Common Substring
原题链接在这里:http://www.lintcode.com/en/problem/longest-common-substring/# 题目: Given two strings, find th ...
- Longest Common Substring
Given two strings, find the longest common substring. Return the length of it. Example Given A = &qu ...
- 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring
LCS - Longest Common Substring no tags A string is finite sequence of characters over a non-empty f ...
- 后缀数组:HDU1043 Longest Common Substring
Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- SPOJ 10570 LONGCS - Longest Common Substring
思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成多组数据就有三倍经验了 代码 #include <cstdio> #inclu ...
- SPOJ 1811 LCS - Longest Common Substring
思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成两个串就有双倍经验了 代码 #include <cstdio> #includ ...
- 最大匹配字符串LCS,The Longest Common Substring
public enum BackTracking { UP, LEFT, NEITHER, UP_AND_LEFT } public abstract class LCSBaseMatch { /// ...
- 最长公共子串(LCS:Longest Common Substring)
最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...
- 【SP1811】LCS - Longest Common Substring
[SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...
随机推荐
- 手动实现一个lazyMan
这应该算一个经典的面试题了,就是一个关于流程控制的问题,要求如下 //实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")//输出: //Hi! This ...
- 基于Python的selenuim自动化测试尝试
工作这么多年了,终于狠下心好好开始学学自动化测试相关知识,揭开这层神秘的面纱. 困难重重,障碍很多,但好在每天都多少有点小收获. 很感谢一个QQ好友推荐的虫师,也非常感谢在这个契机读到了虫师编著的&l ...
- selenium启动IE浏览器报错:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode mu
意思是浏览器的保护模式设置不一致所导致 解决方案-->修改IE设置 将所有区域的保护模式勾选去掉即可
- [转]JS获取URL传参方法
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- FTP2
FTP: 环境:windows, python 3.5功能:1.用户加密认证,可自行配置家目录磁盘大小2.多用户登陆3.查看当前目录(家目录权限下)4.切换目录(家目录权限下)5.上传下载,进度条展示 ...
- 求:斐波那契数列的第n项
def he (n): if n < 3 : return 1 return he(n-1)+he(n-2)print(he(n))
- 第三方库的安装:Pangolin
Pangolin: 一款开源的OPENGL显示库,可以用来视频显示.而且开发容易. 代码我们可以从Github 进行下载:https://github.com/stevenlovegrove/Pang ...
- sql分页汇总-摘抄自网络
文章:几种常见SQL分页方式效率比较 个人倾向于:(2005以上版本支持 row_number()) select * from ( select row_number()over(order by ...
- Java 多线程(Thread)学习
多线程:就是进程的扩展,实现并发.一个进程可以包含多个线程,进程一般是由操作系统控制,而线程就是由程序员控制的,所以作为编程人员做好线程是我们的重点. 线程和进程一样分为五个阶段:创建.就绪.运行.阻 ...
- J2EE的十三个技术——EJB之概述
含义: 企业级的JavaBeans(Enterprise JavaBean),其设计目标是部署分布式应用程序. EJB是J2EE的一部分,称为Java企业Bean,它把使用Java开发的服务器组件的部 ...