• ACM-古老的密码(排序qsort)


    古老的密码

    题目描述:

    给定两个长度一样且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,之后对26个字母做一个一一映射,使得两个字符串相同

    例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,之后把每个字母映射到它的前面一个字母,得到VICTORIOUS,输入两个字符串,输出YES或者NO

    题目分析:

    因为字母可以重排映射(不一定往前映射),所以每个字母的位置并不重要,重要的是每个字母出现的次数

    ①统计两个字符串每个字母出现的次数,得到两个数组cnt1[26],cnt2[26]

    ②之后我们排序下,排序之后结果相同,映射的字符就相同

     

    代码:

     

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #define maxn 101 
     5 
     6 int cmp(const void *a, const void *b)
     7 {
     8     return *(int *)a - *(int *)b;//从小到大排序 
     9 }
    10 /* 
    11 int cmp(const void *a, const void *b)
    12 {
    13     return *(int *)b- *(int *)a;//从大到小排序 
    14 }
    15 */ 
    16 int main()
    17 {
    18     char a[maxn];
    19     char b[maxn];
    20     while(scanf("%s%s",&a,&b) != EOF)
    21     {
    22         int len = strlen(a);
    23         int cnt1[26],cnt2[26];
    24         memset(cnt1,0,sizeof(cnt1));
    25         memset(cnt2,0,sizeof(cnt2));
    26 
    27         for(int i=0; i < len; i++)
    28         {
    29             cnt1[a[i] - 'A']++; //A-0 B-1..... 
    30             cnt2[b[i] - 'A']++;
    31         }
    32 
    33         //排序
    34         qsort(cnt1,26,sizeof(cnt1[0]),cmp);//qsort快速排序 
    35         qsort(cnt2,26,sizeof(cnt2[0]),cmp);
    36 
    37         for(int i=0; i < 26; i++)
    38         {
    39             if(cnt1[i] != cnt2[i])
    40             {
    41                 printf("NO
    ");
    42                 return 0;
    43             }
    44         }
    45         printf("YES
    ");
    46     }
    47 
    48     return 0;
    49 }

     

     

  • 相关阅读:
    Android模拟器中访问局域网地址
    wifidirect
    asp.net上传图片自动生成缩略图功能代码
    Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制
    最简单的三层实例【插入据
    使用RGBa和Filter实现不影响子元素的CSS透明背景
    Jquery ui widget开发
    SQL优化
    SQL SERVER 数据类型
    SQL Server数据库查询速度慢的原因
  • 原文地址:https://www.cnblogs.com/qiujun/p/6061401.html
Copyright © 2020-2023  润新知