zoukankan      html  css  js  c++  java
  • 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 }

     

     

  • 相关阅读:
    各种素材类精品网站
    Java如何设置代理ip
    Spring事务的实现方式和原理以及隔离级别?
    Spring 是什么?
    线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?
    为什么用线程池?解释下线程池参数
    并发三大特性
    ThreadLocal的原理和使用场景。
    谈谈对线程安全的理解
    sleep,wait,join,yield
  • 原文地址:https://www.cnblogs.com/qiujun/p/6061401.html
Copyright © 2011-2022 走看看