Algorithm 下面给出的代码超出了时间限制

Algorithm 下面给出的代码超出了时间限制,algorithm,loops,time,Algorithm,Loops,Time,问题: LabdRunMe被定义为一个字符串,当它在中间分裂时,给出两个字符的相同字符和相同频率的两半。如果字符串中有奇数个字符,我们将忽略中间字符并检查lapindrome。例如,gaga是一个lapindrome,因为ga和ga的两半具有相同频率的相同字符。此外,abccab、rotor和xyzxy是拉宾德罗的几个例子。请注意,abbaab不是拉宾多罗马。两半部分包含相同的字符,但其频率不匹配。 你的任务很简单。给定一个字符串,您需要判断它是否是一个拉宾德罗 输入: 输入的第一行包含一个整

问题:

LabdRunMe被定义为一个字符串,当它在中间分裂时,给出两个字符的相同字符和相同频率的两半。如果字符串中有奇数个字符,我们将忽略中间字符并检查lapindrome。例如,gaga是一个lapindrome,因为ga和ga的两半具有相同频率的相同字符。此外,abccab、rotor和xyzxy是拉宾德罗的几个例子。请注意,abbaab不是拉宾多罗马。两半部分包含相同的字符,但其频率不匹配。 你的任务很简单。给定一个字符串,您需要判断它是否是一个拉宾德罗

输入: 输入的第一行包含一个整数T,即测试用例数。 每个测试都是一行,包含一个仅由小写英文字母组成的字符串S。 输出: 对于每个测试用例,在单独的一行上输出:如果字符串是lapindrome,则为“YES”;如果字符串不是lapindrome,则为“NO”

限制条件:

一,≤ T≤ 一百

二,≤ |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");
    }
}
#包括
#包括
int-found;
int l搜索(字符a[],int l,int h,char p){
int i=l;
对于(i=l;i对于
O(n)
中的每一个字符,您执行
O(n)
搜索,得到
O(n^2)
算法。向其抛出一千个字符串,速度太慢


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

浏览代码时,我注意到您经常使用
strlen
,这需要线性时间,因为它必须遍历字符串,直到找到终止空字符。如果这是C++,我会建议你使用<代码> STD::String S,但是看起来你在这里使用C,所以尽量保持字符串长度的跟踪,而不是使用<代码>斯特伦< /代码>。