题目
Problem Description You are given a number of case-sensitive strings
of alphabetic characters, find the largest string X, such that either
X, or its inverse can be found as a substring of any of the given
strings.Input The first line of the input file contains a single integer t (1
<= t <= 10), the number of test cases, followed by the input data for
each test case. The first line of each test case contains a single
integer n (1 <= n <= 100), the number of given strings, followed by n
lines, each representing one string of minimum length 1 and maximum
length 100. There is no extra white space before and after a string.Output There should be one line per test case containing the length of
the largest string found.
Sample Input
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
Sample Output
2
2
分析
先说一下这道可以用DFS
这道题的分析重点在于时间复杂度
最初的想法便是全枚举 但是担心超时
现在学完时间复杂度之后大致的算一下(只是初学)
字符串的子集全枚举的复杂度是 n^2
然后将字串和下面的m个一一比较 时间复杂度问m^2
两者相乘O(n^2 * m ^2)
在这道题中时间复杂度为 10 * 10 * 100 * 100 = 10 ^ 6
另外说一下 6次方无压力 7次方要求循环尽量简单 8次方要求循环及其简单 (基本没戏)
上代码 + 注释
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int t, n, i, j, k, MIN, f, len, MAX;
char str[105][105], s1[105], s2[105];
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
MIN = 1000;
for (i = 0; i<n; i++)
{
scanf("%s", str[i]);
len = strlen(str[i]);
if (MIN>len)//找到最小串
{
MIN = len;
f = i;
}
}
len = strlen(str[f]);
int flag = 1;
MAX = 0;
for (i = 0; i<len; i++)//作为标本串子串的头
{
for (j = i; j<len; j++)//子串的尾
{
for (k = i; k <= j; k++)//复制为两个串,顺序串s1,逆序串s2
{
s1[k - i] = str[f][k];
s2[j - k] = str[f][k];
}
s1[j - i + 1] = s2[j - i + 1] = '\0';
int l = strlen(s1);
for (k = 0; k<n; k++)//枚举所有串
{
if (!strstr(str[k], s1) && !strstr(str[k], s2))
{
flag = 0;
break;
}
}
if (l>MAX && flag)
MAX = l;
flag = 1;
}
}
printf("%d\n", MAX);
}
return 0;
}