算法导论 练习题 15.4-5
2017-05-24 21:15
295 查看
根据自己思路写的最长公共子序列,稍微修改一下就行了
static int getlastPos(char *s,char c,int pos) { int len=strlen(s),i; for(i=pos-1;i>=0;i--) { if(c==s[i]) return i; } return i; } static int** initM(char *x,char *y) { int xlen=strlen(x); int ylen=strlen(y); int i,j; //m[i][0]:对x[i]之后的字符逐个进行比较,求出目前以x[i]开头最长子串的长度,存储在m[i][1]。 //并找到x[i]最靠近y尾部的位置(但保证现在的子串以x[i]开头,即x[i]的位置比目前子串后面的字符在y中位置靠前),存储在m[i][0] //m[i][1]:以x[i]开头的最长子串长度 //m[i][2]:以x[i]开头的最长子串下一个字符位置 int **m=(int **)malloc(xlen*sizeof(int*)); for(i=0;i<xlen;i++) { m[i]=(int*)malloc(3*sizeof(int)); } for(i=0;i<xlen;i++) { m[i][0]=m[i][1]=0; m[i][2]=xlen; } for(i=xlen-1;i>=0;i--) { m[i][0]=getlastPos(y,x[i],ylen); if(m[i][0]!=-1) m[i][1]=1; else m[i][1]=0; for(j=i+1;j<xlen;j++) { int pos=getlastPos(y,x[i],m[j][0]); //保证单调递增 if(x[i]<y[j] && pos>=0 && m[j][1]+1>m[i][1]) { m[i][0]=pos; m[i][1]=m[j][1]+1; m[i][2]=j; } } } return m; } static void printResult(int **m,int xlen,int max,char* x) { int i,j; for(i=0;i<xlen;i++) { if(m[i][1]==max) break; } while(i<xlen) { printf("%c ",x[i]); i=m[i][2]; } printf("\n"); }
相关文章推荐
- 算法导论第15章练习题 15.4-5
- 算法导论 练习题 15.4-3
- 算法导论第15章练习题 15.4-4
- 算法导论(第三版) 第三章练习题
- 算法导论15.4-6:最长单调递增子序列
- 算法导论 练习题 2.3-7
- 算法导论 练习题 3.2-8
- 算法导论 练习题 4.3-6
- 算法导论 练习题 5.3-1
- 算法导论 练习题 6.1-4
- 算法导论 练习题 7.2-5
- 算法导论 练习题 11.1-2
- 《算法导论》练习题2.1-4————二进制整数相加
- 算法导论 练习题 12.2-1
- 算法导论 练习题 13.3-1
- 算法导论 练习题 14.3-3
- 算法导论 练习题 15.1-3
- 算法导论 练习题 18.1-4
- 算法导论-第15章-动态规划-15.4 最优二叉搜索树
- 算法导论之2.3-7练习题