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 ...
随机推荐
- 风格指南--C++
0.避免多重包含是学编程时基本的要求; 1. 前置声明是为了降低编译依赖,防止修改一个头文件引发多米诺效应; 2. 内联函数的合理使用可提高代码执行效率; 3. ‐inl.h 可提高代码可读性 (一般 ...
- 移动APP自动化测试框架对比
转自微信公众号:腾讯移动品质中心TMQ 移动APP的UI自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化用例的大量维护.从分层测试的角度,自动化测试应该逐层进行.最大量实现自动 ...
- 孤荷凌寒自学python第二十七天python的datetime模块及初识datetime.date模块
孤荷凌寒自学python第二十七天python的datetime模块及初识datetime.date模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.datetime模块 dateti ...
- 孤荷凌寒自学python第五天初识python的列表
孤荷凌寒自学python第五天 列表 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 粗俗地区分列表,可以这样理解,定义或print列表后显示时,列表中的各元素都是用一个方括号[]括起来的. ...
- 网络编程--广播&组播
广播 1.广播地址 如果用{netid, subnetid, hostid}( {网络ID,子网ID,主机ID})表示IPv4地址.那么有四种类型的广播地址,我们用-1表示所有比特位均为1的字段: 1 ...
- Android记事本开发04
昨天: 显式intent 隐身intent 今天: intentFilter 问题: 无法直接预览布局文件的效果.
- pytorch:EDSR 生成训练数据的方法
Pytorch:EDSR 生成训练数据的方法 引言 Winter is coming 正文 pytorch提供的DataLoader 是用来包装你的数据的工具. 所以你要将自己的 (numpy arr ...
- zoj 2110 Tempter of the Bone (dfs)
Tempter of the Bone Time Limit: 2 Seconds Memory Limit: 65536 KB The doggie found a bone in an ...
- poj 2406 Power Strings (后缀数组 || KMP)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 28859 Accepted: 12045 D ...
- hdu 3354 Probability One
Probability One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...