所以我有一个接受两个字符串值的字谜函数。 两个字符串都用char[100]初始化,输入是用户通过键盘输入。
bool isAnagram(char* pattern, char* string) {
int count[256] = {0};
int count2[256] = {0};
int i;
for (i = 0; pattern[i] && string[i]; i++) {
count[pattern[i]]++;
count2[string[i]]++;
}
if (pattern[i] || string[i]) {
return false;
}
for (i = 0; i < 256; i++) {
if (count[i] != count2[i]) {
return false;
}
}
return true;
}
但是这个函数有一个大问题:它区分大小写。我想要所有字谜,包括不区分大小写。
我尝试了许多不同的方法将字符串复制到新的临时小写数组。
bool isAnagram(char* pattern, char* string) {
char tempstr[100];
char tempstr2[100];
int count[256] = {0};
int count2[256] = {0};
int i;
for (i = 0; i < strlen(pattern); i++) {
tempstr[i] = tolower(pattern[i]);
}
for (i = 0; i < strlen(string); i++) {
tempstr2[i] = tolower(string[i]);
}
for (i = 0; tempstr[i] && tempstr2[i]; i++) {
count[tempstr[i]]++;
count2[tempstr2[i]]++;
}
if (tempstr[i] || tempstr2[i]) {
return false;
}
for (i = 0; i < 256; i++) {
if (count[i] != count2[i]) {
return false;
}
}
return true;
}
这只是我尝试过的一种方法。我什至尝试了完全不同的制作字谜的方法。无论我做什么,我都无法复制数组,同时也无法正确检查小写字母的字谜。
老实说我感到很恼火。最近压力很大,我都不知道自己做错了什么。非常感谢任何帮助。
这是您的解决方案。你非常接近——我只稍微修改了你的代码。请注意 tolower() 的用法及其在代码中的位置。这将导致计数数组按照您的计划递增。这会导致解决方案不区分大小写,如输出所示。
#include <stdio.h>
#include <ctype.h> /* tolower() */
bool isAnagram(char* pattern, char* string)
{
int count[256] = {0};
int count2[256] = {0};
int i;
for (i = 0; pattern[i] && string[i]; i++) {
count[tolower(pattern[i])]++; /* added tolower() */
count2[tolower(string[i])]++; /* added tolower() */
}
if (pattern[i] || string[i]) {
return false;
}
for (i = 0; i < 256; i++) {
if (count[i] != count2[i]) {
return false;
}
}
return true;
}
int main ()
{
printf("%s\n", isAnagram("Batman", "Manbat")?"TRUE":"FALSE");
printf("%s\n", isAnagram("Batman", "Cat")?"TRUE":"FALSE");
printf("%s\n", isAnagram("Strut", "Trust")?"TRUE":"FALSE");
return(0);
}
输出:
TRUE
FALSE
TRUE