学习c++后可以用sort,该篇代码用的qsort
先了解一下qsort
第一个参数是待排序的数组起始地址、第二个元素是元素个数,第三个元素是每个元素的大小,最后一个参数比较特别,是指向函数的指针
const void *a是指向常数的万能指针,他可以通过强制类型转化变成任意类型的指针,然后把参数a和b转化为真实的数据,然后让cmp函数当a<b,a=b和a>b时返回负数、0、和正数即可
思路:
写在前排,该题替换不是凯撒密码!不是凯撒密码!不是凯撒密码!我看了很长时间终于理解题意,既然可以随便重排,那么我们可以直接找出两个字符串对应的字母的数量,都排序后,比较两个数组是否相同,如果相同说明可以通过替换让它们的字母一一对应,否则输出NO,题中替换的意思是,每个字母的所有项都改变为其他字母,但每个字母替代的字母不能相同,但有的字母可以是自己本身,注意每个字母都需要替换,只不过有的可能是替换为本身
代码如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> int a[26], b[26]; int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; } int main(void) { char s[99], m[99]; while (scanf("%s %s", s, m) == 2) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); int y = strlen(s); for (int i = 0; i < y; i++) { a[s[i] - 'A']++; b[m[i] - 'A']++; } qsort(a, 26, sizeof(int), cmp); qsort(b, 26, sizeof(int), cmp); int q = 1;//用于记录数组是否相同 for (int i = 0; i < 26; i++) { if (a[i] != b[i]) { printf("NO\n"); q = 0; break; } } if(q) printf("YES\n"); } return 0; }