字符数组在识别字谜方面有何用处?
How is a char array useful in identifying anagrams?
我正在尝试编写一个字谜程序,所以我找到了以下示例作为开始。但是我不太明白这条线,first[a[i]-'a']++;
在这里增加这个 char 数组的值有什么意义?
#include <stdio.h>
int check_anagram(char a[], char b[]){
int first[26] = {0}, second[26] = {0}, i = 0;
while (a[i] != '[=10=]'){
first[a[i]-'a']++; // ??????????
i++;
}
i = 0;
while (b[i] != '[=10=]'){
second[b[i]-'a']++;
i++;
}
for (i = 0; i < 26; i++){
if (first[i] != second[i])
return 0;
}
return 1;
}
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);
return 0;
}
first[]
和 second[]
是分别包含第一个和第二个字符串中出现的字母计数的数组。
所以 first[a[i]-'a']++
增加给定字母的计数。最初,所有字母(索引为 0 - 25,对应于字母 a-z)的计数都将为 0。当你遍历字符串中的每个字母时,你会增加该特定字母的计数。
整个单词的结果是histogram of letter frequencies。
对两个字符串(a 和 b)中的每一个执行此操作可以让您判断它们是否是彼此的变位词:任何一对变位词都将具有相同的直方图。
示例:
"" -> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
"CAT" -> [1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]
"ESTRANGE" -> [1,0,0,0,2,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0]
"SERGEANT" -> [1,0,0,0,2,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0] // same as "ESTRANGE"
行
first[a[i]-'a']++;
假设a[i]
的值在a-z
范围内。当 a[i]
为 a
时,它递增 first[0]
。当 a[i]
为 z
时,它递增 first[25]
。循环结束
while (a[i] != '[=11=]'){
first[a[i]-'a']++; // ??????????
i++;
}
数组 first
包含数组 a
.
中字母 a-z
的计数
我正在尝试编写一个字谜程序,所以我找到了以下示例作为开始。但是我不太明白这条线,first[a[i]-'a']++;
在这里增加这个 char 数组的值有什么意义?
#include <stdio.h>
int check_anagram(char a[], char b[]){
int first[26] = {0}, second[26] = {0}, i = 0;
while (a[i] != '[=10=]'){
first[a[i]-'a']++; // ??????????
i++;
}
i = 0;
while (b[i] != '[=10=]'){
second[b[i]-'a']++;
i++;
}
for (i = 0; i < 26; i++){
if (first[i] != second[i])
return 0;
}
return 1;
}
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);
return 0;
}
first[]
和 second[]
是分别包含第一个和第二个字符串中出现的字母计数的数组。
所以 first[a[i]-'a']++
增加给定字母的计数。最初,所有字母(索引为 0 - 25,对应于字母 a-z)的计数都将为 0。当你遍历字符串中的每个字母时,你会增加该特定字母的计数。
整个单词的结果是histogram of letter frequencies。
对两个字符串(a 和 b)中的每一个执行此操作可以让您判断它们是否是彼此的变位词:任何一对变位词都将具有相同的直方图。
示例:
"" -> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
"CAT" -> [1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]
"ESTRANGE" -> [1,0,0,0,2,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0]
"SERGEANT" -> [1,0,0,0,2,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0] // same as "ESTRANGE"
行
first[a[i]-'a']++;
假设a[i]
的值在a-z
范围内。当 a[i]
为 a
时,它递增 first[0]
。当 a[i]
为 z
时,它递增 first[25]
。循环结束
while (a[i] != '[=11=]'){
first[a[i]-'a']++; // ??????????
i++;
}
数组 first
包含数组 a
.
a-z
的计数