最长公共子串
来源:互联网 发布:zepto.js 滑动 编辑:程序博客网 时间:2024/05/18 02:52
最长公共子串
【问题描述】
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。例如,序列Z=【B,C,D,B】是序列X=【A,B,C,B,D,A,B】的子序列;
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X,Y的公共子序列。
例如,若X=【A,B,C,B,D,A,B】
Y=【 B, D, C, A, B, A】
那么:【 B , C , A 】是X和Y的一个公共子序列
【B,C,B,A】是X和Y的一个公共子序列。
编程求出给定的两个序列中,最长公共子序列的长度。
【输入格式】
共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000。
【输出格式】
一个整数,即两个序列的公共子序列的长度。
分析
此题只需简单地运用一下动态规划的算法即可。不难发现它的子问题就是:
f[i,j]=f[i-1,j-1]+1 当i,j>0时,且xi=yj 时
f[i,j]=Max( f[i,j-1], f[i-1,j] ) 当i,j>0时,且xi≠yj 时
下面附上代码:
var f:array[0..1002,0..1002] of integer; n,m,i,j:integer; x,y:array[1..10000] of char;procedure init;begin while not eoln do begin inc(n); read(x[n]); end; readln; while not eoln do begin inc(m); read(y[m]); end;end;function max(a,b:integer):integer;begin if a>b then max:=a else max:=b;end;begin init; for i:=0 to n do for j:=0 to m do if (i=0) or (j=0) then f[i,j]:=0 else if x[i]=y[j] then f[i,j]:=f[i-1,j-1]+1 else f[i,j]:=max(f[i-1,j], f[i,j-1]); writeln(f[n,m]);end.
1 0
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- 最长公共子串
- DemoA1213
- Java基础知识和常用数据结构整理与分析--Framwork篇
- Java学习笔记排序算法----------插入排序
- 面试经验
- 蛙人高频交易拆单策略—带手续费拆单策略及原理说明
- 最长公共子串
- IP中的保留地址
- 源码分析-FutureTask
- TCP连接的状态详解以及故障排查
- Python学习---第5天---装饰器
- web学习笔记
- codeforces 777 BGame of Credit Cards(贪心)
- sessionStorage,UserDataStorage,cookie全兼容写法存在的问题
- hdu1695 GCD(欧拉函数+容斥原理)