给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。 如JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后把每个字母映射到它前一个字母(B->A, C->B, …, Z->Y, A->Z),得到VICTORIOUS。 输入两个字符串,输出YES或者NO。
分别记录两个字符串中字母A到Z出现的次数,当他们的形式完全相同时,那么他们肯定可以实现一一映射; 比如说在第一个串中A到Z依次是1,2 ,.., 26,而在第二个串中A到Z依次是26, 25, .. , 1,那么他们在形式上是一样的; 也就是说,他们出来的次数组成的数组排序之后应该是相等的。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e4 + 5;#define met(a, b) memset(a, b, sizeof(a));char a[maxn], b[maxn];int ca[26], cb[26];int main() { #ifdef _LOCAL freopen("in.txt", "r", stdin); #endif while(scanf("%s%s", a, b) != EOF) { met(ca, 0); met(cb, 0); int len = strlen(a); for(int i = 0; i < len; ++i) { ++ca[a[i]-'A']; ++cb[b[i]-'A']; } sort(ca, ca + 26); sort(cb, cb + 26); if(memcmp(ca, cb, 26 * sizeof(int)) == 0) PRintf("YES/n"); else printf("NO/n"); } return 0;}新闻热点
疑难解答