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]\)

状态转移方程

\[f[i][j]=f[i-1][j-1]+1
\]

这时直接继承上一个情况即可.

二.\(a[i]!=a[j]\)

此时需要考虑的是,我们依旧要进行状态的传递.

当前\(f[i][j]\)需要继承上一状态取到\(max\)。

那这里的上一状态是什么?

 我们可以知道的是,\(i-1\)位置与\(j\)位置已经有解,\(i\)位置与\(j-1\)位置已经有解。

如何去做?当前位置继承可以选择的状态也就是上面两种状态.

因此状态转移方程为

\[f[i][j]=max(f[i-1][j],f[i][j-1])
\]

这样为什么正确?

我们当前位置为\(a\)串\(i\)和\(b\)串\(j\),最长公共子序列可能是\(a\)串\(i-1\)位置与\(b\)串\(j\)位置结合,

状态转移方程

\[\begin{cases}f[i][j]=f[i-1][j-1]+1 (a[i]==a[j]) \\f[i][j]=max(f[i-1][j],f[i][j-1]) (a[i]!=a[j])\\\end{cases}
\]

由于当前位置\(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$)的更多相关文章

  1. LintCode Longest Common Substring

    原题链接在这里:http://www.lintcode.com/en/problem/longest-common-substring/# 题目: Given two strings, find th ...

  2. Longest Common Substring

    Given two strings, find the longest common substring. Return the length of it. Example Given A = &qu ...

  3. 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring

    LCS - Longest Common Substring no tags  A string is finite sequence of characters over a non-empty f ...

  4. 后缀数组:HDU1043 Longest Common Substring

    Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  5. 利用后缀数组(suffix array)求最长公共子串(longest common substring)

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

  6. SPOJ 10570 LONGCS - Longest Common Substring

    思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成多组数据就有三倍经验了 代码 #include <cstdio> #inclu ...

  7. SPOJ 1811 LCS - Longest Common Substring

    思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成两个串就有双倍经验了 代码 #include <cstdio> #includ ...

  8. 最大匹配字符串LCS,The Longest Common Substring

    public enum BackTracking { UP, LEFT, NEITHER, UP_AND_LEFT } public abstract class LCSBaseMatch { /// ...

  9. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  10. 【SP1811】LCS - Longest Common Substring

    [SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...

随机推荐

  1. global js库

    var GLOBAL = {}; GLOBAL.namespace = function(str) { var arr = str.split("."), o = GLOBAL,i ...

  2. Python MySQLdb 模块使用方法

    import MySQLdb 2.和数据库建立连接 conn=MySQLdb.connect(host="localhost",user="root",pass ...

  3. SPOJ 364 Pocket Money 简单DP

    跟矩阵链乘同类型的题…… 输出用%llu不是%I64u…… 几组数据: 141+2*4+3*4+5*00*5*6+7*3+23+0+6+7+0+44*5+7*1*1+12*0+3*4*0+5*6+7+ ...

  4. Application_Start事件中用Timer做一个循环任务

    protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new Syste ...

  5. [bzoj4372] 烁烁的游戏 [动态点分治+线段树+容斥原理]

    题面 传送门 思路 观察一下题目,要求的是修改"距离点$u$的距离一定的点权值",那这个就不能用传统的dfs序类算法+线段树维护,因为涉及到向父亲回溯的问题 看到和树上距离相关的东 ...

  6. BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】

    题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...

  7. jquery defered的progress方法实现进度条

    效果如图: 实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. Oracle 11g R2 64位在 win7 64位的安装流程图解

    1.下载安装包,可以到oracle官方网站.也可以在这里下载: http://pan.baidu.com/s/1X9xDk 2.解压2个安装包,到同一个database目录: 3.点击database ...

  9. 《c程序设计语言》读书笔记-删除字符串中匹配的字符

    #include <stdio.h> #include <string.h> #define Num 10 int main() { int c,i,j = 0,m,n = 0 ...

  10. Codeforces Round #359 (Div. 2) C

    C. Robbers' watch time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...