最长公共字串LCS算法的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define UPLEFT 1
#define UP 2
#define LEFT 3
char s1[MAX] = {'a','b','c','d','\0'};
int s1len = 4;
char s2[MAX] = {'c','x','b','y','d','z','\0'};
int s2len = 6;
char comm[MAX];
char temp[MAX];
int commlen = 0;
int mx[MAX][MAX];//matrix to store current max common length of two strings
int dir[MAX][MAX];
void init()
{
int i=0;
for(i=0;i<s2len;i++)
{
if(s2[i] == s1[0])
{
mx[0][i] = 1;
dir[0][i] = UPLEFT;
}
else
{
mx[0][i] = 0;
dir[0][i] = LEFT;
}
}
for(i=0;i<s1len;i++)
{
if(s1[i] == s2[0])
{
mx[i][0] = 1;
dir[i][0] = UPLEFT;
}
else
{
mx[i][0] = 0;
dir[i][0] = UP;
}
}
}
/*void clearDir()
{
int i=0,j=0;
for(i=0;i<s1len;i++)
{
for(j=0;j<s2len;j++)
{
dir[i][j] = 0;
}
}
}*/
void buildMx()
{
int i=0,j=0;
for(i=1;i<s1len;i++)
{
for(j=1;j<s2len;j++)
{
if(s1[i] == s2[j])
{
mx[i][j] = mx[i-1][j-1] + 1;
dir[i][j] = UPLEFT;
}
else if(mx[i-1][j]>=mx[i][j-1])
{
mx[i][j] = mx[i-1][j];
dir[i][j] = UP;
}
else
{
mx[i][j] = mx[i][j-1];
dir[i][j] = LEFT;
}
}
}
}
void getLCS()
{
int i=s1len-1;
int j=s2len-1;
int d; //strore temp direction
int c = 1;
int cnt = 0;
while(i>=0 && j>=0)
{
d = dir[i][j];
switch(d)
{
case UP:
i = i-1;
break;
case LEFT:
j = j-1;
break;
case UPLEFT:
temp[cnt] = s1[i];
i = i-1;
j = j-1;
cnt++;
break;
default:
break;
}
}
commlen = cnt;
for(i=0;i<cnt;i++) comm[i] = temp[cnt-i-1];
comm[cnt] = '\0';
}
void PrintLCS()
{
int i=0;
printf("s1: %s\n",s1);
printf("s2: %s\n",s2);
printf("LCS Length: %d\n", commlen);
printf("LCS: ");
/*for(i=0;i<commlen;i++)
{
printf("%c",comm[i]);
}*/
printf("%s\n",comm);
}
int main()
{
scanf("%s", s1);
scanf("%s", s2);
s1len = strlen(s1);
s2len = strlen(s2);
init();
buildMx();
getLCS();//get the longest common string
PrintLCS();
return 0;
}
/*int clearMatrx(int** m)
{
int i=0, j=0;
for(i=0;i<s1len;i++)
{
for(j=0;j<s2len;j++)
{
m[i][j] = 0;
}
}
return 0;
}*/