c - 理解C中的字符数组

标签 c

#include<stdio.h>
#include<string.h>

int check_pal(char *s)
{
    int l = strlen(s),mid,i,h1[256]={0},h2[256]={0};
    mid = l/2;
    if(l&1)
        for(i=0;i<mid;i++)
        {
            //printf("%c %c\n",s[i],s[i+mid]);
            h1[s[i]]++;
            h2[s[i+mid+1]]++;
        }
    else
        for(i=0;i<mid;i++)
        {
            //printf("%c %c\n",s[i],s[i+mid]);
            h1[s[i]]++;
            h2[s[i+mid]]++;
        }

    for(i=0;i<256;i++)
        if(h1[i]!=h2[i])
            return 0;
    return 1;
}

int main()
{
    int t;
    char s[1001];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        if(check_pal(s))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

在上面的程序中,我想了解步骤 h1[s[i]]++;h2[s[i+mid]]++;

最佳答案

该函数检查字符串前半部分和后半部分的字符频率是否相同。

h1[s[i]]++;

s[i] 是字符串s 的字符ih1[] 是前半部分看到的字符数。 h1[s[i]] 是给定字符的编号。 ++ 增加该字符的计数。

h2[s[i+mid]]++; 与字符串的后半部分相同。 +mid 表示我们正在查看字符串的后半部分。

然后它检查所有字符的频率匹配。

关于c - 理解C中的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381117/

相关文章:

c - 试图创建一个简单的 map ,让玩家可以四处走动,但惨败

c - LAPACKE矩阵求逆分段故障C

c - 如何用C语言编写一个函数来断开客户端与服务器的连接?

c - 指针上的引用和整数初始化之间的区别

c - 链表与指针数组上归并排序的时间效率

c - Unix:当读取文件描述符在调用 select() 时关闭时会发生什么

c++ - 在映射最小值和最大值时从无符号转换为有符号的最佳方法?

c - 在头文件中通过宏定义数组

c - 这个用 C 编写的程序没有给出正确的输出

c - c 中的 gethostbyname 与 gethostbyname ("www.google.com"一起使用,但不适用于我的 char *