动态规划
终曲
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2720 Accepted Submission(s):
893
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
题解:
枚举所有字符串,把可行的列出来,在进行排列;选出最优;
#include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; int main(){ string s,s1,s2,s3,str; int t; scanf("%d",&t); getchar(); while(t--){ cin>>s1>>s2>>s3; str=s1+"#"; int len=s1.length(); for(int i=0;i<len;i++){ for(int j=i+1;j<=len;j++){ s=s1.substr(i,j-i);//c++函数,把s1字符串的第i个到第j-i个赋给c; if(s.find(s2)!=-1&&s.find(s3)!=-1){//等于-1表示没有; if(str.length()>s.length()){ str=s; }else{ if(str>s){ str=s; } } } } } if(str.length()==len+1){ printf("No\n"); }else{ cout<<str<<endl; } } return 0; }
#include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; struct node{ string str; int len; }k[11000]; bool cmp(node x,node y){ if(x.len==y.len){ return x.str<y.str; }else{ return x.len<y.len; } } int main(){ string s1,s2,s3; int t; cin>>t; while(t--){ cin>>s1>>s2>>s3; int cnt=0,flag=0; for(int i=0;s1[i];i++){ for(int j=i;s1[j];j++){ string c; for(int q=i;q<=j;q++){ c+=s1[q]; } if(c.find(s2)!=-1&&c.find(s3)!=-1){ k[cnt].str=c; k[cnt].len=c.size(); cnt++; flag=1; break; } } } if(flag==0){ cout<<"No"<<endl; }else{ sort(k,k+cnt,cmp); cout<<k[0].str<<endl; } } return 0; }