基本思路:先按照长度排序,总长度等于第一个子串加上最后一个子串,然后从最后开始枚举子串与子串file[0]相加,也从后开始找到另一个子串与子串file[1]相加,并交换相加顺序,直到两个先加的串相等。
注意考虑所有子串都相等的特殊情况。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_LEN 256*8+5
#define MAX_LINE 300
char file[MAX_LINE][MAX_LEN];
int cmp(const void*a, const void*b) {
return strlen((char*) a) - strlen((char*) b);
}
void judge(int n) {
qsort(file, n, MAX_LEN * sizeof(char), cmp);
int len = strlen(file[0]) + strlen(file[n - 1]);
int i, j;
char str1[len + 5];
char str2[len + 5];
for (i = n - 1; i > 0; i--) {
strcpy(str1, file[0]);
strcat(str1, file[i]);
for (j = n - 1; j > 1; j--) {
if (j == i)
continue;
strcpy(str2, file[1]);
strcat(str2, file[j]);
if (strcmp(str1, str2) == 0) {
printf("%s\n", str1);
return;
}
}
for (j = n - 1; j > 1; j--) {
if (j == i)
continue;
strcpy(str2, file[j]);
strcat(str2, file[1]);
if (strcmp(str1, str2) == 0) {
printf("%s\n", str1);
return;
}
}
}
for (i = n - 1; i > 0; i--) {
strcpy(str1, file[i]);
strcat(str1, file[0]);
for (j = n - 1; j > 1; j--) {
if (j == i)
continue;
strcpy(str2, file[1]);
strcat(str2, file[j]);
if (strcmp(str1, str2) == 0) {
printf("%s\n", str1);
return;
}
}
for (j = n - 1; j > 1; j--) {
if (j == i)
continue;
strcpy(str2, file[j]);
strcat(str2, file[1]);
if (strcmp(str1, str2) == 0) {
printf("%s\n", str1);
return;
}
}
}
}
int main() {
int cases;
scanf("%d", &cases);
getchar();
getchar();
while (cases--) {
int i = 0;
while (1) {
gets(file[i]);
if (file[i][0] == 0)
break;
i++;
}
judge(i);
if (cases)
printf("\n");
}
return 0;
}
本文介绍了一种通过排序和枚举来寻找字符串配对的方法,该方法适用于解决特定类型的字符串匹配问题。通过对输入字符串进行排序并比较不同的组合,可以有效地找出满足条件的字符串对。文章详细解释了算法的实现步骤,并提供了完整的C语言代码示例。
381

被折叠的 条评论
为什么被折叠?



