Saturday, January 21, 2012

LCS - Longest Common Sub sequence

#include<stdio.h>
#include<string.h>
#define M 105
#define N 35


char str1[M][N], str2[M][N];
int c[M][M], b[M][M], check;


void LCS( int len1, int len2 )
{
int i, j, k, l;


for(i=0;i<M;i++)
for(j=0;j<M;j++)
{
c[i][j] = 0;
b[i][j] = 0;
}


for(i=1;i<len1;i++)
{
for(j=1;j<len2;j++)
{
if( strcmp( str1[i], str2[j] )==0 )
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if( c[i-1][j] > c[i][j-1] )
{
c[i][j] = c[i-1][j];
b[i][j] = 0;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
}


void Print_LCS(int len1, int len2)
{
if(len1==0 && len2 ==0) return ;


if( b[len1][len2] == 1)
{
Print_LCS( len1-1, len2-1 );
if(!check) {  printf("%s",str1[len1] ); check = 1; }
else printf(" %s",str1[len1] );
}


else if( b[len1][len2] == 0) Print_LCS( len1-1, len2 );
else if( b[len1][len2] == -1) Print_LCS( len1, len2 -1 );
}


int main(void)
{
//freopen("531.in","r",stdin);
int i, j, k, len1, len2;


char temp[N], c;


while( scanf(" %s",temp)==1 )
{
for(i=1;;i++)
{
if( strcmp( temp,"#")==0) break;


strcpy(str1[i],temp);


scanf(" %s",temp) ;
}


len1 = i;


for( i=1 ; scanf(" %s",temp)==1 ; i++ )
{
if( strcmp( temp,"#")==0) break;


strcpy( str2[i], temp );
}


len2 = i;


LCS(len1, len2); check = 0;


Print_LCS( len1-1, len2 -1 );
printf("\n");
}
return 0;
}
/*
Input:
die einkommen der landwirte
sind fuer die abgeordneten ein buch mit sieben siegeln
um dem abzuhelfen
muessen dringend alle subventionsgesetze verbessert werden
#
die steuern auf vermoegen und einkommen
sollten nach meinung der abgeordneten
nachdruecklich erhoben werden
dazu muessen die kontrollbefugnisse der finanzbehoerden
dringend verbessert werden
#


Output:
die einkommen der abgeordneten muessen dringend verbessert werden
*/

No comments:

Post a Comment