最长公共子序列
来源:互联网 发布:sql trigger insert 编辑:程序博客网 时间:2024/05/21 06:46
#include "stdio.h"#include "stdlib.h"#include "math.h"#include "string.h"#define N 100int lcsLength(char *x, char *y, int lenx, int leny, int z[N][N], int b[N][N])//返回字符串a和b的最长公共子串长度//lenx为字符串x的长度,leny为子串y的长度//z[i][j]记录字符串a[i]、b[j]最长公共子串长度//b[i][j]记录c[i][j]的值是由哪个子问题得到(3种情况之一),构造最长公共子序列时用到{ int i, j; for(i=1; i<=leny; i++) z[0][i] = 0; //当子串a为空时,最长公共子串长度为0 for(i=1; i<=lenx; i++) z[i][0] = 0; //当子串b为空时,最长公共子串长度为0 for(i=1; i<=lenx; i++) //自下而上计算子问题 for(j=1; j<=leny; j++) { if(x[i] == y[j]) //情况1 { z[i][j] = z[i-1][j-1] + 1; b[i][j] = 1; } else if(z[i-1][j] >= z[i][j-1]) //情况2 { z[i][j] = z[i-1][j]; b[i][j] = 2; } else //情况3 { z[i][j] = z[i][j-1]; b[i][j] = 3; } } return z[lenx][leny];}void lcs(int i, int j, char x[N], int b[N][N]) //构造公共子序列{ if(i==0 || j==0) return; /*第1种情况下,X(i)和Y(j)的最长公共子序列由X(i-1)和 Y(j-1)的解LCS(i-1, j-1, x, b),加上位于最后的X[i]组成 */ else if(b[i][j]==1) { lcs(i-1,j-1,x,b); printf("%c", x[i]); } //其它2种情况下,原问题等于子问题解 else if(b[i][j]==2) lcs(i-1,j,x,b); else lcs(i,j-1,x,b);}int main(){ char x[N], y[N]; gets(x); gets(y); int lenx = strlen(x); int leny = strlen(y); int i; for(i=lenx; i>0; i--) x[i] = x[i-1]; for(i=leny; i>0; i--) y[i] = y[i-1]; int z[N][N], b[N][N]; int length = lcsLength(x, y, lenx, leny, z, b); printf("最长公共长度为:%d\n", length); lcs(lenx, leny, x, b); printf("\n"); return 0;}
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 黑马程序员-java基础(四)-面向对象(封装、继承、多态)
- 斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #8
- BufferReader 的使用
- 浅谈HTTP中Get与Post的区别
- 各大公司2016在线笔试(一)
- 最长公共子序列
- MAC电脑DNS劫持解决方法
- nginx文件类型错误解析漏洞
- ubuntu完美搭建git服务器-完善版
- 主窗口(key window)
- 【数据结构与算法】——排序综述
- 四元素(Quaternion)与旋转
- 更新VPS上PHP到最新版
- 简单使用Svn Hook