有效地检查字谜?

时间:2013-04-25 00:55:04

标签: c algorithm

检查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;
}

1 个答案:

答案 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的最大长度