zoukankan      html  css  js  c++  java
  • 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]!='';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
    ");
    54     if(isAnagram(s1,s2)==1)
    55         printf("yes
    ");
    56     return 0;
    57 }
  • 相关阅读:
    算法模板——线性欧拉函数
    2818: Gcd
    1688: [Usaco2005 Open]Disease Manangement 疾病管理
    3314: [Usaco2013 Nov]Crowded Cows
    3450: Tyvj1952 Easy
    1664: [Usaco2006 Open]County Fair Events 参加节日庆祝
    1054: [HAOI2008]移动玩具
    1432: [ZJOI2009]Function
    1121: [POI2008]激光发射器SZK
    1113: [Poi2008]海报PLA
  • 原文地址:https://www.cnblogs.com/jhooon/p/3571525.html
Copyright © 2011-2022 走看看