首页 > 代码库 > 求两个字符串最长公共子串(动态规划)
求两个字符串最长公共子串(动态规划)
code如下:
//Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL) return; int length1 = strlen(str1)+1; int length2 = strlen(str2)+1; int **csLength,**direction;//two arrays to record the length and direction int i,j,maxLength=0,maxI=0,maxJ=0; csLength = (int **)new int[length2]; for(i=0; i<length1; i++) csLength[i] = (int *)new int[length1]; for(i=0;i<length2;i++) for(j=0;j<length1;j++) csLength[i][j] = 0; direction = (int **)new int[length2]; for(i=0; i<length1; i++) direction[i] = (int *)new int[length1]; for(i=0;i<length2;i++) for(j=0;j<length1;j++) direction[i][j] = 0; for(i=1;i<length2;i++) for(j=1;j<length1;j++) { if(str2[i-1] == str1[j-1]) { csLength[i][j] = csLength[i-1][j-1] + 1; direction[i][j] = 3;//3 means leftup } else if(csLength[i-1][j] > csLength[i][j-1]) { csLength[i][j] = csLength[i-1][j]; direction[i][j] = 1;//1 means left } else { csLength[i][j] = csLength[i][j-1]; direction[i][j] = 2;//2 means up } if(maxLength < csLength[i][j]) { maxLength = csLength[i][j];//record th max length and the corresponding index maxI = i; maxJ = j; } } i = maxI; j = maxJ; //the output is in reverse order while(i!=0 && j!= 0) { if( str2[i-1] == str1[j-1]) cout<<str2[i-1]<<" "; if(direction[i][j] == 3) { i--; j--; } else if(direction[i][j] == 1) { i--; } else if(direction[i][j] == 2) { j--; } } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。