apple peach ananas banana pear peach
appleach bananas pearch
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503
题意:将两个字符串结合起来,他们的公共子串只输出一次
思路:根据LCS的原理,将每个字符都进行标记,看两个字符串中对应的字符究竟处于什么状态,
然后输出,其标记为公共子串的字符只输出一次即可,也是一道模板题 详细方法见代码。
关于 >>最长公共子序列<< 链接
#include<cstring> #include<cstdio> #include<iostream> using namespace std; /*** 题意:将两个字符串结合起来,他们的公共子串只输出一次 思路:根据LCS的原理,将每个字符都进行标记,看两个字符串中对应的字符究竟处于什么状态, 然后输出,其标记为公共子串的字符只输出一次即可,也是一道模板题 */ int map[1005][1005]; string str1,str2; /**方案一:利用vis记录返回的路径*/ /* int vis[1005][1005]; void LCS(int len1,int len2) { // memset(vis,0,sizeof(vis)); for(int i=0;i<len1;i++) {map[i][0]=0; vis[i][0]=1;} for(int j=0;j<len2;j++) {map[0][j]=0; vis[0][j]=-1;} for(int i=1;i<=len1;i++) { for(int j=1;j<=len2;j++) { if(str1[i-1]==str2[j-1]){ map[i][j]=map[i-1][j-1]+1; vis[i][j]=0;} else if(map[i-1][j]>=map[i][j-1]){ map[i][j]=map[i-1][j]; vis[i][j]=1;} else { map[i][j]=map[i][j-1]; vis[i][j]=-1; } } } } void Print(int i,int j) { // printf("-------\n"); if(i==0 && j==0) return ; if(vis[i][j]==0) { Print(i-1,j-1); printf("%c",str1[i-1]); } else if(vis[i][j]==1) { Print(i-1,j); printf("%c",str1[i-1]); } else { Print(i,j-1); printf("%c",str2[j-1]); } }*/ /***方案二:利用map本身的变化,找路径 规律是根据map[i][j] 与map[i-1][j-1]、map[i-1][j]、map[i][j-1]的关系来确定 具体来说:map[i-1][j-1]==map[i-1][j]==map[i][j-1] && map[i][j]==map[i-1][j-1]+1;表示共同点 可以通过观察map[][]来发现! */ void LCS(int len1,int len2) { for(int i=0;i<=len1;i++) { for(int j=0;j<=len2;j++) { if(i==0||j==0) {map[i][j]=0; continue;} if(str1[i-1]==str2[j-1]){ map[i][j]=map[i-1][j-1]+1;} else if(map[i-1][j]>=map[i][j-1]){ map[i][j]=map[i-1][j];} else { map[i][j]=map[i][j-1]; } } } } void Print(int i,int j) { // printf("-------\n"); if(i==0 && j==0) return ; if(map[i][j]==map[i-1][j-1]+1 && map[i-1][j]==map[i][j-1] && map[i-1][j-1]==map[i-1][j]) { Print(i-1,j-1); printf("%c",str1[i-1]); } else if(map[i][j]==map[i-1][j]) { Print(i-1,j); printf("%c",str1[i-1]); } else { Print(i,j-1); printf("%c",str2[j-1]); } } int main() { while(cin>>str1>>str2) { int len1=str1.length(); int len2=str2.length(); LCS(len1,len2); /** for(int i=0;i<=len1;i++) { for(int j=0;j<=len2;j++) { printf("%d\t",vis[i][j]); } printf("\n"); } *//** for(int i=0;i<=len1;i++) { for(int j=0;j<=len2;j++) { printf("%d\t",map[i][j]); } printf("\n"); } */ Print(len1,len2); printf("\n"); } return 0; }