题目大意:给出两段文字,求出最长的公共单词串。
直接是以前的代码改一点就A了。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s1[35][100],s2[35][100],s[35][100]; int len1,len2,dp[105][105],mark[105][105],l; void LCS() { int i,j; memset(dp,0,sizeof(dp)); for(i = 0;i<=len1;i++) mark[i][0] = 1; for(i = 0;i<=len2;i++) mark[0][i] = -1; for(i = 1; i<=len1; i++) { for(j = 1; j<=len2; j++) { if(!strcmp(s1[i-1],s2[j-1])) { dp[i][j] = dp[i-1][j-1]+1; mark[i][j] = 0; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j] = dp[i-1][j]; mark[i][j] = 1; } else { dp[i][j] = dp[i][j-1]; mark[i][j] = -1; } } } } void PrintLCS(int i,int j) { if(!i && !j) return; if(mark[i][j]==0) { PrintLCS(i-1,j-1); strcpy(s[l++], s1[i-1]); } else if(mark[i][j]==1)//根据回溯的位置进行输出 { PrintLCS(i-1,j); } else { PrintLCS(i,j-1); } } int main() { while(~scanf("%s",s1[1])) { len1=1; len2=0; while(strcmp(s1[len1], "#")) scanf("%s", s1[++len1]); while(strcmp(s2[len2], "#")) scanf("%s", s2[++len2]); l=0; LCS(); PrintLCS(len1, len2); for(int i=1; i<l; ++i) { if(i==1) printf("%s", s[i]); else printf(" %s", s[i]); } printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/wangxinxin_/article/details/45175101