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. 【Neural Network】林轩田机器学习技法

    首先从单层神经网络开始介绍 最简单的单层神经网络可以看成是多个Perception的线性组合,这种简单的组合可以达到一些复杂的boundary. 比如,最简单的逻辑运算AND  OR NOT都可以由多 ...

  2. jmeter之录制控制器与代理的使用

    1.       先启动jmeter,在测试计划中添加线程组 2.       选中线程组右键添加,在配置元件中点击HTTP请求默认值 3.       选中线程组右键添加,在逻辑控制器中点击录制控制 ...

  3. JMeter学习笔记(三) 录制脚本

    jmeter测试脚本,可以通过其他工具进行录制,例如 BadBoy,我之前使用过此工具,安装以及使用都比较简单的,大家可以在网上搜索一下. 在此整理一下jmeter自带的录制功能,进行录制脚本. 1. ...

  4. Oz代码梳理

    https://files.cnblogs.com/files/gushiren/oz%E6%B5%81%E7%A8%8B%E5%9B%BE.pdf https://files.cnblogs.com ...

  5. heat launch an instance

    在包含Orchestration服务的环境中,可以创建启动实例的堆栈 创建yam文件 heat_template_version: 2015-10-15 description: Launch a b ...

  6. pytorch版本问题:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'

    用pytorch加载训练好的模型的时候遇到了如下的问题: AttributeError: 'module' object has no attribute '_rebuild_tensor_v2' 到 ...

  7. Spring MVC表单标签

    从Spring 2.0开始,Spring MVC开始全面支持表单标签,通过Spring MVC表单标签,我们可以很容易地将控制器相关的表单对象绑定到HTML表单元素中. form标签     和使用任 ...

  8. PHP可变变量的简单使用

    知识点: 可变变量:简单说就是将一个变量的值用作另外一个变量的命名上,例如$a = 'b';$$a就是$b HTML代码: <!doctype html> <html> < ...

  9. 虚机中访问外网;NAT中的POSTROUTING是怎么搞的?

    看下docker中是怎么配置的网络 在虚机中访问外网:设定了qemu,在主机上添加路由:sudo iptables -t nat -I POSTROUTING -s 192.168.1.110 -j ...

  10. user-select & css

    user-select & css https://developer.mozilla.org/en-US/docs/Web/CSS/user-select https://css-trick ...