c - 如何判断字符串是否为 Lapindrome?

标签 c arrays string codeblocks

以下代码给出了 codechef 问题页面上给出的正确输出: Improve this question 但提交时得到错误答案 请告诉我我的代码可能存在的问题

问题来了

Lapindrome 被定义为一个字符串,当它从中间分割时,会产生具有相同字符和每个字符相同频率的两半。如果字符串中有奇数个字符,我们会忽略中间的字符并检查 Lapindrome。例如,gaga 是一个 Lapindrome,因为 ga 和 ga 的两半具有相同的字符和相同的频率。此外,abccab、rotor 和 xyzxy 也是 Lapindrome 的几个示例。请注意,abbaab 不是一个 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");
    }
    return 0;
}

最佳答案

我建议您阅读模块化;它会让你的生活更轻松。

#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;
}

关于c - 如何判断字符串是否为 Lapindrome?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21145620/

相关文章:

c - 如何将字符串数组指针传递给新的字符数组?在C中

ios - 枚举时 NSArrayM 发生了变异 - 添加对象,而不是删除

string - 通过 Perl 从 xls 读取日期到 csv

c - 如何检查用户是否在键盘上输入了 "enter"? (C)

C - 不评估条件

无法在 main() 和函数(列表)之间传递值

c - Windows 服务 : Listening on socket while running as LocalSystem

python - 计算落在一组 x、y、z 坐标之间的值的数量

php - 将 Twitter 趋势输出解析为 PHP 中的数组

c++ - 以类似于初始化字符串文字的方式初始化 char 数组