CCI_Q1.4
本文参考该作者文章:
作者:Hawstein
出处:http://hawstein.com/posts/ctci-solutions-contents.html
一.
Q:写一个函数判断两个字符串是否是变位词。(变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词。)
思路:
isAnagrm(char*,char*):先将两字符串进行插入排序,再比较两字符串是否相等。
isAnagrm2(char*,char*):由于组成变位词的字符是一模一样的, 因此我们可以先统计每个字符串中各个字符出现的次数, 然后看这两个字符串中各字符出现次数是否一样。如果是,则它们是一对变位词。 这需要开一个辅助数组来保存各字符的出现次数。我们可以开一个大小是256的整数数组, 遍历第一个字符串时,将相应字符出现的次数加1;遍历第二个字符串时, 将相应字符出现的次数减1。最后如果数组中256个数都为0,说明两个字符串是一对变位词。 (第1个字符串中出现的字符都被第2个字符串出现的字符抵消了), 如果数组中有一个不为0,说明它们不是一对变位词。
CODE:
1 #include<stdio.h> 2 #include<string.h> 3 #include<memory.h> 4 #define key(A) (A) 5 #define less(A,B) (key(A)<key(B)) 6 #define exch(A,B) {char t=A;A=B;B=t;} 7 void insertion(char s[],int l,int r) 8 { 9 int i,j; 10 for(i=r;i>l;i--) 11 if(less(s[i],s[i-1])) 12 exch(s[i-1],s[i]); 13 for(i=l+2;i<=r;i++) 14 { 15 j=i;char v=s[i]; 16 while(less(v,s[j-1])) 17 s[j]=s[--j]; 18 s[j]=v; 19 } 20 } 21 int isAnagram(char s1[],char s2[]) 22 { 23 if((int)strlen(s1)!=(int)strlen(s2))return 0; 24 if(s1==""||s2=="")return 0; 25 insertion(s1,0,strlen(s1)-1); 26 insertion(s2,0,strlen(s2)-1); 27 if(strcmp(s1,s2)==0) 28 return 1; 29 return 0; 30 } 31 int isAnagram2(char s1[],char s2[]) 32 { 33 if((int)strlen(s1)!=strlen(s2))return 0; 34 if(s1==""||s2=="")return 0; 35 int s[128]; 36 memset(s,0,sizeof(s)); 37 int i; 38 for(i=0;s1[i]!='\0';i++) 39 { 40 s[(int)s1[i]]++; 41 s[(int)s2[i]]--; 42 } 43 for(i=0;i<128;i++) 44 if(s[i]!=0) 45 return 0; 46 return 1; 47 } 48 int main(void) 49 { 50 char s1[]="abbcddfa"; 51 char s2[]="cddfbbaa"; 52 if(isAnagram2(s1,s2)==1) 53 printf("yes\n"); 54 if(isAnagram(s1,s2)==1) 55 printf("yes\n"); 56 return 0; 57 }