以下代码提供了codechef问题页面上给出的正确输出:http://www.codechef.com/problems/LAPIN 但在提交时得到错误答案 请告诉我我的代码可能存在的问题
这是问题
Lapindrome定义为一个字符串,当在中间分割时,给出两个具有相同字符和每个字符相同频率的一半。如果字符串中有奇数个字符,我们忽略中间字符并检查lapindrome。例如,gaga是一个lapindrome,因为两个ga和ga具有相同频率的相同字符。此外,abccab,转子和xyzxy是lapindromes的几个例子。请注意,青蒿不是白痴。两半包含相同的字符,但它们的频率不匹配。 你的任务很简单。给定一个字符串,你需要告诉它是否是一个lapindrome。
输入:
第一行输入包含一个整数T,即测试用例的数量。
每个测试都是一行,其中包含仅由小写英文字母组成的字符串S.
输出:
对于每个测试用例,在单独的行上输出:如果字符串是lapindrome则为“YES”,如果不是则为“NO”。
这是代码
#include<stdio.h>
#include<string.h>
int main()
{
int f,t,mid,len;
char arr[1000];
int left[125],right[125];
scanf("%d",&t);
for(int i=0;i<t;i++)
{
f=0;
scanf("%s",arr);
memset(left,0,sizeof(left));
memset(right,0,sizeof(right));
len=strlen(arr);
for(int i=0;i<len/2;i++)
left[arr[i]]++;
for(int i=(len+1)/2;i<len;i++)
right[arr[i]]++;
for(int i=0;i<strlen(arr);i++)
{
if(left[arr[i]]!=right[arr[i]])
f++;
break;
}
if(f==0)
printf("YES\n");
else
printf("NO\n");
}
}
答案 0 :(得分:2)
我建议您阅读模块化内容;它会让你的生活更轻松。
#include <stdio.h>
#define BOOL unsigned char
#define TRUE 1
#define FALSE 0
unsigned string_length(char *string)
{
unsigned counter = 0;
while (string[counter++] != '\0') { }
return counter - 1;
}
BOOL are_equal(unsigned *a, unsigned *b, int size)
{
int i;
for (i = 0; i < size; ++i)
{
if (a[i] != b[i])
{
return FALSE;
}
}
return TRUE;
}
BOOL is_lapindrome(char *string)
{
unsigned left[26] = { 0 }, right[26] = { 0 },
str_len = string_length(string);
if (str_len < 2)
{
return FALSE;
}
int i;
for (i = 0; i <= str_len / 2 - 1; ++i)
{
left[string[i] - 'a']++;
}
for (i = (str_len + 1) / 2; i < str_len; ++i)
{
right[string[i] - 'a']++;
}
return are_equal(left, right, 26);
}
int main()
{
char *list[6] =
{
"gaga",
"abcde",
"rotor",
"xyzxy",
"abbaab",
"ababc"
};
int i;
for (i = 0; i < 6; ++i)
{
printf("%s\n", is_lapindrome(list[i]) == TRUE ? "YES" : "NO");
}
return 0;
}
答案 1 :(得分:1)
你的缓冲区是一个字节太短 - 一个1000字符的字符串需要1001 char
s,nul
终结符占用的最后一个字符。
“小写英文字母”听起来有点含糊不清 - 我会说通过一些解释,它可能包含空格。如果是这样,输入将被错误地读取。
我现在看不到其他问题,但我强烈怀疑第一个问题。