题意:
求最多的相同的单词,单词顺序是不变的,就是求出最长的公共单词串。
思路:
LCS。
代码:
#include<stdio.h>
#include<string.h>
char str1[105][32],str2[105][32];
int Y;
struct Node1
{
int pre;
int x;
} map[105][105];
struct Node2
{
int x,y;
} d[105];
void LCS(int len1,int len2)
{
for(int i=1; i<=len1; i++)
for(int j=1; j<=len2; j++)
{
if(strcmp(str1[i-1],str2[j-1])==0)
{
map[i][j].x=map[i-1][j-1].x+1;
map[i][j].pre=2;
}
else if(map[i][j-1].x>map[i-1][j].x)
{
map[i][j].x=map[i][j-1].x;
map[i][j].pre=3;
}
else
{
map[i][j].x=map[i-1][j].x;
map[i][j].pre=1;
}
}
}
void digui(int i,int j,int cur)
{
if(i==0||j==0)
{
d[cur].x=i;
d[cur].y=j;
Y=cur;
return ;
}
if(map[i][j].pre==1)
{
d[cur].x=i;
d[cur].y=j;
digui(i-1,j,cur+1);
}
else if(map[i][j].pre==2)
{
d[cur].x=i;
d[cur].y=j;
digui(i-1,j-1,cur+1);
}
else if(map[i][j].pre==3)
{
d[cur].x=i;
d[cur].y=j;
digui(i,j-1,cur+1);
}
}
int main()
{
while(scanf("%s",str1[0])!=EOF)
{
int i=1,len1,len2;
while(scanf("%s",str1[i])!=EOF)
{
if(str1[i][0]=='#')
{
len1=i;
break;
}
i++;
}
i=0;
while(scanf("%s",str2[i])!=EOF)
{
if(str2[i][0]=='#')
{
len2=i;
break;
}
i++;
}
for(i=0; i<=len1; i++)
map[0][i].x=0;
for(i=0; i<=len2; i++)
map[i][0].x=0;
LCS(len1,len2);
digui(len1,len2,0);
for(int i=Y-1; i>=0; i--)
{
if(map[d[i].x][d[i].y].x!=map[d[i+1].x][d[i+1].y].x)
{
printf("%s%c",str1[d[i].x-1],map[len1][len2].x==map[d[i].x][d[i].y].x?'\n':' ');
}
}
}
}