终曲
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1289 Accepted Submission(s): 370
Problem Description
最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
Input
输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
Output
请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 No
如果没有,请输出 No
Sample Input
2 abcd ab bc abc ab bd
Sample Output
abc No/*题解: 先求出下面两个字符串在第一个字符串中的下标位置,如果字符串没有包含下面的字符串(即未记录下标位置)则输出No, 根据开始下标和结束下标求出包含两个字符串的子串。 然后排序,求出最短子串。若长度相同则排字母序。 */#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s1[1010],s2[1010],s3[1010]; struct ST { int st; int end; }e1[1010],e2[1010]; struct MS { char s[110]; }e[1010]; int cmp(MS a,MS b) { int x=strlen(a.s),y=strlen(b.s); if(x==y) return strcmp(a.s,b.s)<0; else return x<y; } int main() { int i,j,k,k1,k2,T,t,a,b,l; int str[100]; scanf("%d",&T); while(T--) { memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); memset(s3,0,sizeof(s3)); scanf("%s %s %s",s1,s2,s3); int len1=strlen(s1),len2=strlen(s2),len3=strlen(s3); i=j=k1=0; while(i<len1) { //将模式串在目标串中的位置统计出来 j=0; t=i; while(s2[j]==s1[t]&&j<len2) { j++; t++; } // printf("%d--\n",j); if(j==len2) { e1[k1].end=t-1; e1[k1].st=e1[k1].end-len2+1; k1++; } i++; } i=j=k2=0; while(i<len1) { //将模式串在目标串中的位置统计出来 j=0; t=i; while(s3[j]==s1[t]&&j<len3) { j++; t++; } // printf("%d--\n",j); if(j==len3) { e2[k2].end=t-1; e2[k2].st=e2[k2].end-len3+1; k2++; } i++; } for(i=0,k=0; i<k1; i++) { for(j=0; j<k2; j++) { a=min(e1[i].st,e2[j].st); b=max(e1[i].end,e2[j].end); for(l=0;a<=b;a++) e[k].s[l++]=s1[a]; e[k++].s[l]='\0'; //求出包含两个字符串的子串 } } sort(e,e+k,cmp); //排序,先排长度,再排字典序 if(k==0) printf("No\n"); else { printf("%s",e[0].s); printf("\n"); } } return 0; }/*题解:
见识到C++函数的强大功能,不愧是在C的改进上的一门语言
*/#include<cstring> #include<iostream> using namespace std; int main() { int T,i,j,n; cin>>T; while(T--) { string s,s1,s2,s3,str; //str起临时存储的作用 cin>>s1>>s2>>s3; n=s1.length(); str=s1+"#"; for(i=0; i<n; i++) { for(j=i+1; j<=n; j++) { s=s1.substr(i,j-i); //substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。 if(s.find(s2)!=-1&&s.find(s3)!=-1) //未找到s2、s3则返回-1 { if(s.length()<str.length()) { str=s; } else if(s.length()==str.length()) { if(s<str) str=s; } } } } if(str.length()==n+1) cout<<"No"<<endl; else cout<<str<<endl; } return 0; }