算法导论 思考题 15-5a (编辑距离)
2017-05-30 23:17
260 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #define OP_NUM 5 #define COPY 0 #define REPLACE 1 #define DELETE 1 #define INSERT 1 #define TWIDDLE 1 #define KILL 0 int** dp(char *x,char *z,char **b) { int i,j,xlen=strlen(x),zlen=strlen(z); xlen=xlen+1; zlen=zlen+1; int **s=(int**)malloc(xlen*sizeof(int*)); for(int k=0;k<xlen+1;k++) { s[k]=(int*)malloc(zlen*sizeof(int)); } for(i=0;i<xlen;i++) { s[i][0]=DELETE; b[i][0]='D'; } for(j=0;j<zlen;j++) { s[0][j]=INSERT; b[0][j]='I'; } for(i=1;i<xlen;i++) { for(j=1;j<zlen;j++) { s[i][j]=INT_MAX; if(x[i-1]==z[j-1]) { if(s[i-1][j-1]+COPY<s[i][j]) { s[i][j]=s[i-1][j-1]+COPY; b[i][j]='C'; } } else { if(s[i-1][j-1]+REPLACE<s[i][j]) { s[i][j]=s[i-1][j-1]+REPLACE; b[i][j]='R'; } } if(s[i-1][j]+DELETE<s[i][j]) { s[i][j]=s[i-1][j]+DELETE; b[i][j]='D'; } if(s[i][j-1]+INSERT<s[i][j]) { s[i][j]=s[i][j-1]+INSERT; b[i][j]='I'; } if(i>=2 && j>=2 && x[i-1]==z[j-2] && x[i-2]==z[j-1] && s[i-2][j-2]+TWIDDLE<s[i][j]) { s[i][j]=s[i-2][j-2]+TWIDDLE; b[i][j]='T'; } } } return s; } void printS(int **s,int xlen,int zlen) { xlen=xlen+1; zlen=zlen+1; for(int i=0;i<xlen;i++) { for(int j=0;j<zlen;j++) { printf("%2d ",s[i][j]); } printf("\n"); } } void printB(char **b,int xlen,int zlen) { xlen=xlen+1; zlen=zlen+1; for(int i=0;i<xlen;i++) { for(int j=0;j<zlen;j++) { printf("%2c ",b[i][j]); } printf("\n"); } } void getTrace(char **b,int i,int j) { if(i<=0 && j<=0) return; if(b[i][j]=='C' || b[i][j]=='R') getTrace(b,i-1,j-1); else if(b[i][j]=='D') getTrace(b,i-1,j); else if(b[i][j]=='I') getTrace(b,i,j-1); else getTrace(b,i-2,j-2); if(b[i][j]=='C') printf("%s ","COPY"); else if(b[i][j]=='R') printf("%s ","REPLACE"); else if(b[i][j]=='D') printf("%s ","DELETE"); else if(b[i][j]=='I') printf("%s ","INSERT"); else printf("%s ","TWIDDLE"); } void main() { char *x="algorithm"; char *z="altruistic"; //char *x="aaabbbcccddd"; //char *z="aaaeeeddd"; int xlen=strlen(x),zlen=strlen(z); char **b=(char**)malloc((xlen+1)*sizeof(char*)); for(int k=0;k<xlen+1;k++) { b[k]=(char*)malloc((zlen+1)*sizeof(int)); } int **s=dp(x,z,b); printS(s,xlen,zlen); printB(b,xlen,zlen); getTrace(b,xlen,zlen); getchar(); }
相关文章推荐
- 算法导论 15-3 编辑距离
- 算法导论-15-3-编辑距离
- 算法导论-15-3-编辑距离
- 《算法导论》15-3:编辑距离
- 算法导论思考题答案 思考题15-2 整齐打印
- 算法导论 思考题 15-8(基于接缝裁剪的图像压缩)
- 算法导论 思考题 15-1(有向无环图中的最长简单路径)
- 算法导论 思考题 15-9(字符串拆分)
- 九章算法面试题15 字符串编辑距离
- 算法导论 思考题 15-2(最长回文子序列)
- 算法导论 思考题 15-6(公司聚会计划)
- 算法导论 思考题 15-12(签约棒球自由球员)
- 算法导论 思考题 15-4(整齐打印)
- 算法导论 思考题 15-11(库存规划)
- POJ 3356 AGTC(算法导论15-5编辑距离) 经典dp
- Levenshtein距离(编辑距离)
- 字符串相似度算法(编辑距离算法 Levenshtein Distance)
- 编辑距离问题
- 126.编辑距离问题
- 华为OJ 计算字符串相似度或者编辑距离 JAVA