版权声明:IT交流QQ群328880248,欢迎大家来一起学习一起交流~本篇文章未经同意请勿转载! https://blog.csdn.net/m0_38072683/article/details/87473210
终曲
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
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
思路
一道水题给我搞自闭了,自闭了。
第一次提交了 直接就WA了,哎,我还一直以为是我的程序逻辑问题,后来才发现是我的数组开的小了。
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 100 + 10;
const int MINN = 10 + 2;
char a[MAXN],b[MINN],c[MINN],t[MAXN*2],res[MAXN*2];
int main() {
int n;
scanf("%d", &n);
while(n--){
scanf("%s", a);
scanf("%s", b);
scanf("%s", c);
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = strlen(c);
int min1 = max(len_b, len_c);
int min_len = 10000;
for (int i = 0; i < len_a; i++) {
for(int j = i + min1 - 1; j < len_a; j++) {
for (int k = i; k <= j; k++) {
t[k-i] = a[k];
}
t[j-i+1] = '\0';
int len = strlen(t);
if (strstr(t, b) && strstr(t, c)) {
if (min_len > len) {
strcpy(res, t);
min_len = len;
} else if(min_len == len) {
if (strcmp(res, t) > 0) {
strcpy(res, t);
}
}
}
}
}
if (min_len == 10000) {
printf("No\n");
} else {
printf("%s\n", res);
}
}
return 0;
}