题意:中文题目。
解题思路:首先找出后面两个串中最长的串,然后以最长的串的长度为初始截取长度从母串的第一个位置依次遍历截取,将每次截取的符合条件的相同长度的串存入一个字符串集合set当中(set有自动排序功能),然后将集合当中的第一个字符串输出即可,若没有则输出No,详见代码。
Code:
#include <iostream>
#include <string>
#include <cstdio>
#include <set>
using namespace std;
set<string> vis;
int Judge(string str1,string str2)//判断两个串是否有包含关系
{
int flag = 0;
string str3;
int len1 = str1.length();
int len2 = str2.length();
for(int i = 0; i <= (len1-len2); i++)
{
str3 = str1.substr(i,len2);
if(str3==str2) {flag = 1; break;}
}
if(flag) return 1;
else return 0;
}
int main()
{
//freopen("input.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
string str1,str2;
string str3,str4;
cin>>str1>>str2>>str3;
int len1 = str1.length();
int len2 = str2.length();
int len3 = str3.length();
int Max = max(len2,len3);
int flag1 = 0;
for(int j = Max; j<=len1; j++)//截取子串的长度从最长的一个串的长度开始依次增加
{
vis.clear();
for(int i = 0; i<= (len1-j); i++)//每次改变截取长度时都要从新遍历依次母串
{
str4 = str1.substr(i,j);
if(Judge(str4,str2) && Judge(str4,str3)) vis.insert(str4);//将长度相等的符合条件的子串放进set中
}
if(vis.size()) {flag1 = 1; break;}//如果集合大小不为零直接跳出
}
if(flag1) cout<<*vis.begin()<<endl;//当flag1==1时,直接输出集合当中的第一个字符串即为满足条件的子串
else cout<<"No"<<endl;//否则输出No
}
return 0;
}