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,所以尽量保持字符串长度的跟踪,而不是使用<代码>斯特伦< /代码>。