LCS最长公共子序列
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串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的最长公共子序列;
3)若xm≠yn且zk≠yn,则Z是X和Yn-1的最长公共子序列;
也就是说:
当xm=yn时,LCS(Xm,Yn)=LCS(Xm-1,,Yn-1)+1;
当xm≠yn时,LCS(Xm,Yn)=max{LCS(Xm-1,,Yn),LCS(Xm,Yn-1)};
当X,Y为空时,LCS长度为0;
#include<iostream>
#include<cmath>
#define INF 9999999
using namespace std;
int a[][]; //记录已经计算过的子问题
int fun(const char* str1,const char* str2,int i,int j)
{
if(a[i][j]<INF)return a[i][j]; //表示该子问题已经计算过
else if(i==||j==) a[i][j]=;
else if(str1[i-]==str2[j-]) a[i][j]=fun(str1,str2,i-,j-)+;
else a[i][j]=max(fun(str1,str2,i-,j),fun(str1,str2,i,j-));
return a[i][j];
}
int longest(const char* str1,const char* str2)
{
int m=strlen(str1);
int n=strlen(str2);
memset(a,INF,sizeof(a)); //将a的元素设置为INF
return fun(str1,str2,m,n);
}
int main()
{
char *str1=new char[],*str2=new char[];
cout<<"input first string:";
cin>>str1;
cout<<"input second string:";
cin>>str2;
cout<<"the longest length of sunstring is:";
cout<<longest(str1,str2)<<endl;
delete []str1;
delete []str2;
}
结果:

LCS最长公共子序列的更多相关文章
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- 动态规划模板2|LCS最长公共子序列
LCS最长公共子序列 模板代码: #include <iostream> #include <string.h> #include <string> using n ...
- LCS 最长公共子序列
区别最长公共子串(连续) ''' LCS 最长公共子序列 ''' def LCS_len(x, y): m = len(x) n = len(y) dp = [[0] * (n + 1) for i ...
- LCS最长公共子序列(最优线性时间O(n))
这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...
- LCS最长公共子序列HDU1159
最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...
- POJ 2250(LCS最长公共子序列)
compromise Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- Atcoder F - LCS (DP-最长公共子序列,输出字符串)
F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...
随机推荐
- javascript跨域请求RESTful Web Service
跨域请求RESTful Web Service 当我们用js请求RESTful Web Service的时候,通常会出现跨域无法访问的问题,也就是无法正常得到我们要的值.jsonp是个解决问题的方法. ...
- hdu-5683 zxa and xor (位运算)
题目链接: zxa and xor Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- Jquery图片轮播和CSS图片轮播
学习Jquery以后,很多时候觉得比写源生代码要简单一点.我们用JQuery做了一个图片轮播的动画,感觉比写CSS要简单一些.下面我来具体讲一下是怎么用JQuery来写. <body> & ...
- IOS添加控件
YJQApp *appInfo =self.apps[i]; //.添加图片 UIImageView * iconView = [[UIImageView alloc]init]; CGFloat i ...
- 在sql-server上建立mysql链接库
EXEC sp_addlinkedserver @server = N'RESUME_MYSQL_CONN', @srvproduct=N'MySQL ODBC 5.1 Driver', @provi ...
- Oracle中建立物化视图报错
Oracle中建立物化视图报错 今天在建立视图的时候,报了一个错:ORA-01723: zero-length columns are not allowed. 建视图的语句: create mate ...
- 20140122-Application19事件
- NodeJs多进程和socket.io通讯-DEMO
一.开启多进程 const os = require('os'); const cp = require('child_process'); const forkList = {}; const fo ...
- 【笔记】Windows Phone 8开发笔记之API
Windows Phone 8 API一览 Windows Phone 7平台不支持Native语言的开发,这困扰了许多游戏和底层应用的开发者.Windows Phone 8 SDK的推出,改善了这个 ...
- Jexus 高并发请求的优化技巧 笔记
Jexus web server 5.1 每个工作进程的最大并发数固定为1万,最多可以同时开启4个工作进程,因此,每台Jexus V5.1服务器最多可以到支持4万个并发连接.但是,按照linux系统的 ...