LCS 最长公共子子串】的更多相关文章

与 最长公共子序列类似 只是最长公共子串必须连续 所以只能走斜线!!!! ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i in range(m + 1)] B = [[' '] * (n + 1) for i in range(m + 1)] for i in range(1, m + 1): for j in range(1, n + 1): if x[i - 1] =…
LIS(最长递增子序列)和LCS(最长公共子序列)的总结 最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2) s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1; s1[i - 1] != s2[j - 1], dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]); 初始化:dp[i][0] = dp…
#!一个序列S任意删除若干个字符得到的新序列T,则T叫做S的子序列 注意,这个和最长公共字串不一样,最长公共子串要求连续. 1.算法公式: def lcs(a,b): lena = len(a) lenb = len(b) c=[[0]*(lenb+1) for j in range(lena+1) ] flag = [[0]*(lenb+1) for j in range(lena+1) ] for i in range(lena+1)[1:]: for j in range (lenb+1)…
package maxCommon; /** * 找到最长公共子串 * @author root */ public class MaxCommonUnSeries { public static void main(String[] args) { // TODO Auto-generated method stub String s1 = "AGTA"; String s2 = "AGGCT"; //String s = find(s1.toCharArray(…
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的最长公共子串方法.最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度:还可以进一步优化,用后缀数组的方法优化成线性时间O(nlogn):空间也可以用其他方法优化成线性.3.LIS(最长递增序列)DP方法可实现O(n^2)的时间复杂度,进一步优化最佳可达到O(nlogn)…
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X=<x0,x1,...,xm>和Y=<y0,y1,...,yn>的一个最长公共子序列为Z=<z0,z1,...,zk>,则: 1)若xm=yn,则必然有zk=xm=yn,则zk-1是xm-1和yn-1的最长公共子序列: 2)若xm≠yn且zk≠xm,则Z是Xm-1和Y的最长公…
区别最长公共子串(连续) ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i in range(m + 1)] B = [[' '] * (n + 1) for i in range(m + 1)] for i in range(1, m + 1): for j in range(1, n + 1): if x[i - 1] == y[j - 1]: dp[i][j] = d…
后缀数组很久很久以前就出现了,具体的概念读者自行搜索,小菜仅略知一二,不便讨论. 本文通过寻找两个字符串的最长公共子字符串,演示了后缀数组的经典应用. 首先需要说明,小菜实现的这个后缀数组算法,并非标准,只是借鉴了其中的思想. 小菜实现的算法,有两个版本,第一个是空间换时间,第二个是时间换空间. 空间换时间版本 /* 利用后缀数组获取两个字符串最长公共子字符串 空间换时间版本 @params s1 String,要分析的字符串 s2 String,要分析的字符串 norepeat Boolean…
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/F 题目: Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43388   Accepted: 17613 Description A subsequen…
uva 10066 The Twin Towers 标题效果:最长公共子. 解题思路:最长公共子. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int a[105], b[105], dp[105][105]; int main() { int n, m, Case = 1; while (scanf(&quo…
LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using namespace std; int dp[110][110]; int main() { string a,b; memset(dp,0,sizeof(dp)); cin>>a>>b; int lena = a.size(); int lenb = b.size(); for(int…
首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的 1.最长公共子序列 1.最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题 2.同时,子问题的解释可以被重复使用的,也就是说更高级别的子问题会重用更小子问题的解. 满足这两点以后,很容易就想到用动态规划来求解. 1.假设两个字符串s1, s2.当其中一个串的长度为0时,公共子序列的长度肯定为0. 2.假设s1的第i个字符与s2的第j个字符相等时,最长子序列等于s1的第i-1个字符与s2的第j-1个字符最…
链接:UVa 10192 题意:给定两个字符串.求最长公共子串的长度 思路:这个是最长公共子串的直接应用 #include<stdio.h> #include<string.h> int max(int a,int b) { return a>b?a:b; } int main() { char s[105],t[105]; int i,j,k=0,m,n,dp[105][105]; while(gets(s)!=NULL){ if(strcmp(s,"#"…
他们都是用dp做;复杂度都是O(N方) 有一个大佬的博客写的很详细,是关于最长公共子序列的:https://blog.csdn.net/hrn1216/article/details/51534607#comments: 我觉得一开始处理这种问题比较棘手,无从下手,而dp一般有两种状态转移的思考方式,一种是正着,一种是倒着,而且dp一般记录的信息都是按照一定顺序,以什么结尾的答案,或者以什么开头的答案具有的一种性质,然后我们按顺序增加或减少开头或者结尾,形成一种状态的传递关系,还有一些状态的传递…
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:http://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html) 动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率. 1)最长公共子序列的长度的动态规划方程 设有字符串a[0...n],b[0...m],下面就是递推…
一个:介绍KMP算法之前,首先解释一下BF算法 (1)BF算法(传统的匹配算法,是最简单的算法) BF算法是一种常见的模式匹配算法,BF该算法的思想是目标字符串S模式串的第一个字符P的第一个字符,以匹配,如果相等,然后去比较S第二个字和P:若不相等.则比較S的第二个字符和P的第一个字符.依次比較下去.直到得出最后的匹配结果.     (2)举例说明:     S:  ababcababa     P:  ababa BF算法匹配的过程例如以下            i=0            …
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4532    Accepted Submission(s): 1547 Problem Description A palindrome is a symmetri…
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 YCLPBPG,其最长公共子序列则是YLBG 当然当字符串比较大时候,枚举则略显困难. 首先我们先考虑求一个基本问题,就是LCS的长度. 很容易可以理解递推式: 当a[i]==b[j],c[i][j]=c[i-1][j-1]+1; 当a[i]!=b[j], c[i][j]=max(c[i-1][j],…
compromise Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfilled, and this is…
Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18387    Accepted Submission(s): 7769 Problem Description A subsequence of a given sequence is the given sequence with some el…
AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below: Deletion: a letter in x is missing in y at a corresponding position. Insertion: a letter in y is missin…
思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚開始用了第二个字符的长度来推断WA了2发才发现. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<…
F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are given strings ss and tt. Find one longest string that is a subsequence of both ss and tt. Notes A subsequence of a string xx is the string obtained by r…
链接:https://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506来源:牛客网 查找两个字符串a,b中的最长公共子串.若有多个,输出在较短串中最先出现的那个. 输入描述: 输入两个字符串 输出描述: 返回重复出现的字符 输入例子: abcdefghijklmnop abcsafjklmnopqrstuvw 输出例子: jklmnop //思路:动态规划经典问题,加一个start标记即可,注意将较短子串最先出现…
LCS(Longest Common Subsequence),即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 原理:    事实上,最长公共子序列问题也有最优子结构性质.然后,用动态规划的方法找到状态转换方程. 记:Xi=﹤x1,⋯,xi﹥即X序列的前i个字符 (1≤i≤m)(前缀) Yj=﹤y1,⋯,yj﹥即Y序列的前j个字符 (1≤j≤n)(前缀) 假定Z=﹤z1,⋯,zk﹥∈LCS(X , Y). 若xm=yn(最后一个字符相同…
uva 10192 Vacation The Problem You are planning to take some rest and to go out on vacation, but you really don't know which cities you should visit. So, you ask your parents for help. Your mother says "My son, you MUST visit Paris, Madrid, Lisboa an…
http://poj.org/problem?id=1159 题目大意:  给你一个n  代表n个字符   第二行给你一个字符串  求使这个字符串变成回文字符串 最少需要添加多少个字符 分析:   原来的字符串长度-原来的字符串与逆置后的字符串的最长公共字串  就是求得的添加的字符 但是n是5000  如果单用dp[N][N]  肯定会内存超限   所以我们用滚动数字 这是我第一次接触滚动数字  好像也是dp的一种   就是把第一维变成2 反正每一次i j 都只用到上一层 #include<cs…
由于noi OJ上没有Special Judge,所以我是没有在这上面AC的.但是在POJ上A了. 题意如标题. 解法:f[i][j]表示a串前i个和b串前j个且包含b[j]的最长公共上升子序列长度 首先,可用3重循环得到,k循环找到b串j之前的最大长度子序列的结尾字符b[k],得以更新现在f[i][j]的状态.然后,由于k循环的都在j之前,可发现k循环可略去,直接将满足上升的字符用临时变量存,每次j循环的都更新就好了. 具体上,最初f[i][j]=f[i-1][j],先继承好上一个状态,a[i…
Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> using namespace std; string a,b; int dp[1003][1003]; int main(){ while(cin>>a>>b){…
题目链接:  http://codeforces.com/contest/335/problem/B 分析: 第一眼看上去串的长度为5*10^4, 冒似只能用O(n)的算法可解. 而这样的算法从来没见过...... 其实不然, 注意一个条件"如果有存在长度为100的回文子串则输出长度为100的,否则输出最长的", 可以发现: 一个长度大于100的回文串都可以变成长度为100的 如: 长度为101的只要删除中间的一个就变为长度为100的, 长度为102的删除中间两个也变为长度为100的.…