最长公共子序列
和网上的一样,没什么特别的。vs2010编译,就是warning多点。
#include <stdio.h>
#include <stdlib.h>
#define LEN 20
void lcs(char*,int, char*, int, int(*)[]);
void printMatrix(int(*)[], int, int);
void printLCS(int(*)[], int, int,char*);
void main(){
char b[]="cnblogs";
char a[]="belongsaa";
int sizeA=sizeof(a)/sizeof(a[0]);
int sizeB=sizeof(b)/sizeof(b[0]);
int c[LEN][LEN]={0};
lcs(a,sizeA,b,sizeB,c);
printMatrix(c,sizeA, sizeB);
printLCS(c,sizeA,sizeB,b);
system("pause");
}
void lcs(char* a, int sizeA, char* b, int sizeB, int c[LEN][LEN]){
int i,j;
for ( i=0; i<sizeA; i++){
for(j=0; j<sizeB; j++){
if(a[i]!=b[j]){
if(c[i][j+1]>=c[i+1][j]){
c[i+1][j+1]=c[i][j+1];
}else{
c[i+1][j+1]=c[i+1][j];
}
}
if(a[i]==b[j]){
c[i+1][j+1]=c[i][j] + 1;
}
}
}
}
void printMatrix(int c[LEN][LEN],int sizeA, int sizeB){
int m,n;
for (m=0; m < sizeA; m++){
printf("\n");
for(n=0; n< sizeB; n++){
printf("%d ", c[m][n]);
}
}
}
void printLCS(int c[LEN][LEN], int sizeA, int sizeB,char* b){
int m,n,k,kk;
char tmp[100]={'\0'};
n=sizeB;
m=sizeA;
k=0;
while(m>0 && n>0){
if(c[m][n]==c[m-1][n]&&c[m-1][n]==c[m][n-1]){
m--;
}
if(c[m][n]-1==c[m-1][n]&&c[m-1][n]==c[m][n-1]){
m--;
n--;
tmp[k]=b[n];
k++;
}
if(c[m-1][n]>c[m][n-1]){
m--;
}
if(c[m-1][n]<c[m][n-1]){
n--;
}
}
for(kk=k; kk>=0;kk--){
printf("%c ",tmp[kk]);
}
}