最长公共子序列
2015-10-11 18:19
309 查看
#include "stdio.h" #include "stdlib.h" #include "math.h" #include "string.h" #define N 100 int 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 , y ; 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 , b ; int length = lcsLength(x, y, lenx, leny, z, b); printf("最长公共长度为:%d\n", length); lcs(lenx, leny, x, b); printf("\n"); return 0; }
相关文章推荐
- android【基础】 style标签应用与activity间的淡入淡出切换
- 挑战程序设计竞赛:三角形
- 开发小公司的一个程序模块的感触
- 浅谈HTTP中Get与Post的区别
- R12 查询EBS用户相关SQL
- Web存储
- BufferReader 的使用
- 斯坦福iOS7 2013-2014秋Assignment 6的一种答案 #8
- 黑马程序员-java基础(四)-面向对象(封装、继承、多态)
- hdu 5500 Reorder the Books
- Number类为数字到字符串的类型转换场景定义三种方法
- maven3.3.3 mac 下 Unsupported major.minor version 51.0
- python中魔法属性和魔法方法
- poj2761(treap入门)
- 01.移动先行之谁主沉浮----我的第一个程序
- JavaScript基础——类型、值和变量
- 设计模式之责任链模式
- 【转】JAVA的StringBuffer类
- 校门外的树
- English-单词属性缩写