所以我有一个接受两个字符串值的变位函数。两个字符串都是用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;
}
这只是我尝试的一种方式。我甚至尝试了完全不同的方法来做字谜。无论我做了什么,我都无法复制数组,同时也无法正确地检查与数组的字谜。
老实说,我感到恼火。我最近压力很大,我都不知道自己做错了什么。任何帮助都非常感谢。
2条答案
按热度按时间btqmn9zl1#
别生气学习如何规划行动是学习的全部。
稍微修改你的(更简单的)第一个版本应该提供解决方案。
注意事项:
1.在这样的函数中,较短的变量名更容易阅读/扫描。
str1
和str2
是本地和消耗性的;用作指针简化了代码。1.大写字母字符将作为其对应的大写字母进行计数。
1.转换为
unsigned char
可以防止b7被设置时出现的 sign extension。1.你的“直方图”统计是精心策划的!干得漂亮!
1.数组元素的索引应该是
size_t i
(永远不会为负)。编辑
如果你真的想给人留下深刻印象,把
for()
循环和return true;
替换为:或者,更进一步:
五行代码用一行来表达。
字谜:“活”,“邪恶”,“卑鄙”,“面纱”...:-)
fdbelqdn2#
这里有一个解决方案给你。你已经很接近了--我只是稍微修改了你的代码。注意tolower()的用法及其在代码中的位置。这将导致计数数组按计划递增。这将产生一个不区分大小写的解决方案,如输出所示。编辑:还注意到@Aconcagua的评论中添加了“unsigned char”。可运行代码可在here上使用。
输出量: