求两个字符串最长公共子串(动态规划)

来源:互联网 发布:office2016破解软件 编辑:程序博客网 时间:2024/05/01 09:32

code如下:

//Longest common sequence, dynamic programming methodvoid 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 directionint 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 indexmaxI = i;maxJ = j;}}i = maxI;j = maxJ;//the output is in reverse orderwhile(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--;}}}


0 0