如何查找该字符串是否为Lapindrome?

时间:2014-01-15 18:39:00

标签: c arrays string codeblocks

以下代码提供了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");
    }
}

2 个答案:

答案 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)

  1. 你的缓冲区是一个字节太短 - 一个1000字符的字符串需要1001 char s,nul终结符占用的最后一个字符。

  2. “小写英文字母”听起来有点含糊不清 - 我会说通过一些解释,它可能包含空格。如果是这样,输入将被错误地读取。

  3. 我现在看不到其他问题,但我强烈怀疑第一个问题。