我正在检查字符串字谜。但我无法理解背后的逻辑
int check_anagram(char a[], char b[])
函数。
此代码仅提供小写字母或大写字符串anagram。 我想让它不区分大小写。请提供必要的更改。
#include<stdio.h>
#include<conio.h>
#include<string.h>
int check_anagram(char [], char []);
int main()
{
char a[100], b[100];
int flag;
printf("Enter first string\n");
gets(a);
printf("Enter second string\n");
gets(b);
flag = check_anagram(a, b);
if (flag == 1)
printf("\"%s\" and \"%s\" are anagrams.\n", a, b);
else
printf("\"%s\" and \"%s\" are not anagrams.\n", a, b);
system("pause");
return 0;
}
int check_anagram(char a[], char b[])
{
int first[26] = {0}, second[26] = {0}, c = 0;
while (a[c] != '\0')
{
first[a[c]-'a']++;
c++;
}
c = 0;
while (b[c] != '\0')
{
second[b[c]-'a']++;
c++;
}
for (c = 0; c < 26; c++)
{
if (first[c] != second[c])
return 0;
}
return 1;
}
请妥善解释:
first[a[c]-'a']++;
second[b[c]-'a']++;
答案 0 :(得分:2)
first[a[c]-'a']++;
取字符串'a'的第c个字母的字母索引(0-26)。例如,如果我们输入“test”,那么对于每个字母,a [c]等于:
't','e','s','t'
然后a [c] - 'a'等于(其中'a'== 97和't'== 116):
19,4,18,19
然后首先[a [c] - 'a'] ++增加每个字符的字母索引,所以首先最终会像:
a e s t
{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0}
要使代码正常工作,您只需预先格式化每个字符串,使它们都是小写字母,或者检查大写字母并添加32(ascii差异)。查看一个ascii表来帮助您,这里有一个:ASCII TABLE - IMAGE
答案 1 :(得分:1)
a[c]
是char
。字符用C表示,通过ASCII,代码使用0-255范围内的不同integera作为字符。 char
s的算术是通过这些代码完成的。
字母a-z由一组连续的整数进行ASCII编码,因此当letter - 'a'
为小写字母时,您可以使用letter
之类的表达式来获取该字母的索引。 (即'a' - 'a'
为0,'b' - 'a'
为1,'c' - 'a'
为2,等等。)这使您可以轻松地将字母转换为索引以便在数组中使用。