【发布时间】:2012-10-11 11:08:03
【问题描述】:
可能重复:
What is an easy way to tell if a list of words are anagrams of each other?
finding if two words are anagrams of each other
我编写了下面的 C 代码来检查两个给定的字符串是否是彼此的字谜。 我知道这在复杂性/效率方面是最糟糕的,而且还有很多更好的方法可以做到这一点。
#include "stdio.h"
main()
{
char s1[]="mist";
char s2[]="mitt";
int i,j,isanag=0;
if(strlen(s1)!=strlen(s2))
printf("Not anagrams\n");
for(i=0;i<strlen(s1);i++)
{
isanag=0;
for(j=0;j<strlen(s2);j++)
{
if(s1[i]==s2[j])
{
isanag = 1;
break;
}
}
if(isanag == 0)
{
printf("Not anagrams\n");
getch();
exit(0);
}
}
printf("Yes Anagrams\n");
getch();
}
这可以正常工作并打印正确的 Not Anagrams 如果我如下交换两个字符串的名称,则会给出错误的答案
char s1[]="mitt";
char s2[]="mist";
我知道 2 个 for 循环的编码方式,这很明显。
我可以做些什么来改进这个代码并解决这个怪癖?
【问题讨论】:
-
穷人
main()返回类型你住哪里? -
您的算法是错误的,因为它只检查
s1的所有不同字符是否存在于s2中,但不 检查s2中是否有字符不在s1中。这就是为什么"mitt"被报告为"mist"的字谜;s2中的's'被忽略。您的程序也无法检测到不同数量的重复字母,即"mistmt"vs"mist" -
您的算法可能是最差的。它的复杂度是
O(n^2 * m^2),其中 n 和 m 是长度。查看 dup 以获得更好的答案。 -
@C2H5OH 你在盗用我的名字吗? :D
-
@KingsIndian:如果 n 和 m 是 2 个字符串的长度,我不认为这个复杂度是 O(n^2*m^2),我看到这是 O(n*m) .注意详细说明。