【发布时间】:2017-10-27 23:14:52
【问题描述】:
#include <stdio.h>
main()
{
char *a = "stack";
char *b = "cats";
int l = 0; // for length of string b
clrscr();
while (*b != NULL)
{
l++;
b++;
}
b--; // now b points to last char of the string
// printf("%d\n", l);
while ((*a - *b == 32) || (*a == *b))
{
printf("%c %c\n", *a, *b);
a++;
b--;
l--;
if (l == 0)
break;
}
l == 0 ? printf("anagrams") : printf("not anagrams");
getch();
}
我编写了代码来检查两个字符串 a 和 b 是否是字谜。
当b的长度比a短并且是a的子串时,代码显示误报。
例如。 b 是 "cats" 反过来是 "stac" 而 a 是 "stack" 代码将 a 和 b 显示为字谜
【问题讨论】:
-
检查它们是否具有相同的strlen?
-
这不是检查字谜,它只是检查子串,对吧?如果字母的顺序不同,它就行不通。检查长度的差异,就像 kaylum 说的那样,然后你可以用于字谜的一个技巧是按字母顺序对两个字符串进行排序,然后比较它们。如果它们是字谜,它们将是相等的。
-
检查字谜的简单方法是使用一对组成 subject 的字符频率数组(例如,
[a-zA-Z0-9]需要 62-元素数组)并出现在建议的 anagram 中。如果 subject 的频率数组与建议的 anagram 的频率数组相同,那么您就有一个实际的 anagram 填充每个频率数组后,它是if (memcmp (subfreq, anafreq, nelem * sizeof *subfreq) == 0) {...it's an anagram...}的简单问题,这允许您跳过空格等。例如nag a ram是主题词anagram的变位词。
标签: c string pointers c-strings anagram