判断子序列、求最长公共子序列算法实现
来源:互联网 发布:linux创建文件目录 编辑:程序博客网 时间:2024/06/06 06:38
#include<stdio.h>#include<string.h>#include<stdlib.h>#define FAIL 0#define SUCCESS 1//贪心法int getSubsequence(char P[], char T[]){ int j = 0; int i; int m = strlen(P); int n = strlen(T); for (i = 0; i < m; i++) { //让P序列中的每一个字符和T序列中的字符进行比较 while (P[i] != T[j]) { j++; if (j == n) { return FAIL; } } j++; if (j == n) { return FAIL; } } return SUCCESS;}//动态规划法void longestCommonSubsequence(char R[], char Q[]){ int m = strlen(R); //R序列的长度 int n = strlen(Q); //Q序列的长度 char (*W)[m+1]; //W指向m+1个char值构成的数组 W = (char (*)[m+1])malloc((n+1)*(m+1)*sizeof(int)); //动态申请n+1行m+1列的二维数组 int i, j; for (i = 0; i <= m; i++) { W[0][i] = 0; //将第一行置为0 } for (j = 1; j <= n; j++) { W[j][0] = 0; //将第一列置为0 } for (i = 1; i <= m; i++) { for(j = 1; j <= n; j++) { if (R[i-1] == Q[j-1]) { W[i][j] = W[i-1][j-1] + 1; } else { if (W[i][j-1] >= W[i-1][j]) { W[i][j] = W[i][j-1]; } else { W[i][j] = W[i-1][j]; } } } } //输出这个二维数组W for (i = 0; i <= m; i++) { for (j = 0; j <= n; j++) { printf("%d\t", W[i][j]); } printf("\n"); } //逆序打印最大公共序列 for (i = m, j = n; i >= 1 && j >= 1;) { if (R[i-1] == Q[j-1]) { printf("%c ", R[i-1]); i--; j--; } else { if (W[i][j-1] > W[i-1][j]) { j--; } else { i--; } } } free(W);}int main(){ char P[] = "ACAB"; char T[] = "ABCACABA"; // P是T的子序列,当且仅当P中所有字符都以相同的顺序在T中出现 if (getSubsequence(P, T)) { puts("P是Q的子序列。"); } else { puts("P不是Q的子序列。"); } //最长公共子序列,X是Y的子序列,当且仅当X中的所有字符在Y中以相同的顺序出现 char R[] = "ABBCADC"; char Q[] = "BABBAC"; longestCommonSubsequence(R, Q); printf("\n"); }
运行结果:
0 0
- 判断子序列、求最长公共子序列算法实现
- 【基础算法】求最长公共子序列
- 求最长公共子序列
- 求公共最长子序列
- 求最长公共子序列
- 求最长公共子序列
- 求最长公共子序列
- 求最长公共子序列
- 求最长公共子序列
- 求最长公共子序列
- 求公共最长子序列
- 求最长公共子序列
- 算法:最长公共子序列
- 最长公共子序列算法
- 【算法】最长公共子序列
- 最长公共子序列算法
- 算法--最长公共子序列
- <算法> 最长公共子序列
- Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型
- 自我反省(一)
- poj-2140
- 你为你的机会准备了什么
- ZOJ Problem Set - 1188 DNA Sorting
- 判断子序列、求最长公共子序列算法实现
- tomcat 卡死 Initializing Spring root WebApplicationContext
- Xcode6编译SDWebImage报错解决方法(SDWebImageDownloaderOperation.m错误)
- HDU 2.1.1最小公倍数
- sdut 3-1 Point类的构造函数
- 美团二面经验
- 输入两个整数n和m, 从数列1,2,...,n中任意选择几个数,使其和等于m, 要求编写程序输出所有的组合
- an android virtual device that failed to load 安卓虚拟机无法启动
- 文件的读写操作