2013-04-25 43 views
0

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

回答

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的最大

+0

可以避免与'INT散列[128] = {0}的初始值设定回路;' – 2013-04-25 01:09:12

+1

我我不是半隐秘代码的粉丝(我明白上述)。这篇文章将从一些解释中得到解释,说明为什么以及如何运作,以及它背后的直觉,而不是关注“看看我需要多少个时钟周期和LOC”。 – 2013-04-25 01:09:13

+0

我用解释和复杂性@G巴赫编辑了这篇文章。谢谢:) @ KingsIndian – faisal 2013-04-25 01:20:41