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 }

 

posted @ 2014-02-27 14:56  哈士奇.银桑  阅读(215)  评论(0编辑  收藏  举报