我的代码中超出了时间限制

时间:2018-03-14 21:47:37

标签: algorithm loops time

问题:

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编译器表示超出了时间限制。请告诉我它为什么这么说

1 个答案:

答案 0 :(得分:2)

对于每个O(n)字符,您执行O(n)搜索,导致O(n^2)算法。在它上面扔了一千个字符串,它太慢了。

这可以通过两种标准方式解决。第一种是对字符串的每一半进行排序然后进行比较。第二种是为字母频率创建哈希表,然后进行比较。