动态规划

终曲

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个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
 

 

Input
输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
 

 

Output
请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 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;
}

 

posted @ 2019-05-06 20:26  jhjdsdsgd  阅读(108)  评论(0编辑  收藏  举报