检查2个字符串(由const char *表示)是否是字谜的最有效方法是什么?我知道我们可以排序然后比较。但是,排序是nlogn。
感谢您的帮助。
编辑:由于没有展示我的尝试,我得到了投票。所以,我的尝试是:int anagram(const char * c1, const char *c2){
char *s1=my_sort(c1);
char *s2=my_sort(c2);
return strcmp(s1,s2)==0?1:0;
}
答案 0 :(得分:5)
来自我的一篇博文:)
/**
* Works for 0-127 ASCII string
**/
int isanagram(const char* s1,const char* s2){
int hash[128];
int i;
for(i=0;i<128;i++)
hash[i]=0;
while(*s1) hash[*s1++]++;
while(*s2) hash[*s2++]--;
for(i=0;i<128;i++)
if(hash[i]) return 0;
return 1;
}
说明:字母表中的每个字符都在哈希表中有一个位置。对于s1中的每个char,我们递增该char的计数,并且对于s2中的每个char,我们减少哈希表中char的计数。如果所有的char在结尾都有0个计数,那么s1和s2都有相同数量的每个char,这是anagram的定义。
复杂度:O(n)如果n> 128,其中n是s1和s2的最大长度