问题:
Lapindrome定义为一个字符串,当在中间分割时,给出两个具有相同字符和每个字符相同频率的一半。如果字符串中有奇数个字符,我们忽略中间字符并检查lapindrome。例如,gaga是一个lapindrome,因为两个ga和ga具有相同频率的相同字符。此外,abccab,转子和xyzxy是lapindromes的几个例子。请注意,青蒿不是白痴。两半包含相同的字符,但它们的频率不匹配。 你的任务很简单。给定一个字符串,你需要告诉它是否是一个lapindrome。
输入: 第一行输入包含单个整数T,即测试用例的数量。 每个测试都是一行,包含一个仅由小写英文字母组成的字符串S. 输出: 对于每个测试用例,在单独的行上输出:" YES"如果该字符串是一个lapindrome和" NO"如果不是。
约束:
1≤T≤100
2≤| S | ≤1000,其中| S |表示S的长度
#include <stdio.h>
#include <string.h>
int found;
int lsearch(char a[], int l, int h, char p) {
int i = l;
for (i = l; i <= h; i++) {
if (a[i] == p) {
found = 0;
return i;
}
}
return -1;
}
int main() {
char s[100];
int q, z, i, T;
scanf("%d", &T);
while (T--) {
q = 0;
scanf("%s", &s);
if (strlen(s) % 2 == 0)
for (i = 0; i < (strlen(s) / 2); i++) {
z = lsearch(s, strlen(s) / 2, strlen(s) - 1, s[i]);
if (found == 0) {
found = -1;
s[z] = -2;
} else
q = 1;
} else
for (i = 0; i < (strlen(s) / 2); i++) {
z = lsearch(s, 1 + (strlen(s) / 2), strlen(s) - 1, s[i]);
if (found == 0) {
found = -1;
s[z] = -2;
} else
q = 1;
}
if (strlen(s) % 2 == 0)
for (i = (strlen(s) / 2); i < strlen(s); i++) {
if (s[i] != -2)
q = 1;
} else
for (i = (strlen(s) / 2) + 1; i < strlen(s); i++) {
if (s[i] != -2)
q = 1;
}
if (q == 1)
printf("NO\n");
else
printf("YES\n");
}
}
我在codeblocks中获得了正确的输出,但codechef编译器表示超出了时间限制。请告诉我它为什么这么说
答案 0 :(得分:2)
对于每个O(n)
字符,您执行O(n)
搜索,导致O(n^2)
算法。在它上面扔了一千个字符串,它太慢了。
这可以通过两种标准方式解决。第一种是对字符串的每一半进行排序然后进行比较。第二种是为字母频率创建哈希表,然后进行比较。