题目大意:将两个字符串结合起来,他们的公共子串只输出一次
根据LCS的原理,将每个字符都进行标记,看两个字符串中对应的字符究竟处于什么状态,然后输出,其标记为公共子串的字符只输出一次即可,也是一道模板题了。
http://blog.csdn.net/libin56842/article/details/9618529
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s1[1000],s2[1000]; int len1,len2,dp[1000][1000],mark[1000][1000]; 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(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); printf("%c",s1[i-1]); } else if(mark[i][j]==1)//根据回溯的位置进行输出 { PrintLCS(i-1,j); printf("%c",s1[i-1]); } else { PrintLCS(i,j-1); printf("%c",s2[j-1]); } } int main() { while(~scanf("%s%s",s1,s2)) { len1 = strlen(s1); len2 = strlen(s2); LCS(); PrintLCS(len1,len2); printf("\n"); } return 0; }
时间: 2024-10-10 17:08:13