当前位置: 代码迷 >> 综合 >> UVA--1339--字母映射
  详细解决方案

UVA--1339--字母映射

热度:83   发布时间:2023-12-12 06:31:24.0

题目描述:
给定两个长度一样且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,之后对26个字母做一个一一映射,使得两个字符串相同
例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,之后把每个字母映射到它的前面一个字母,得到VICTORIOUS,输入两个字符串,输出YES或者NO
思路:
因为字母可以重排,每个字母的位置并不重要,重要的是每个字母出现的次数
①统计两个字符串每个字母出现的次数,得到两个数组cnt1[26],cnt2[26]
②之后我们排序下,排序之后结果相同,说明我们输入的两个字符串就可以通过重排一一映射变得相同了所以本道题的核心在与【排序】

Sample Input
JWPUDJSTVP
VICTORIOUS
MAMA
ROME
HAHA
HEHE
AAA
AAA
NEERCISTHEBEST
SECRETMESSAGES
Sample Output
YES
NO
YES
YES
NO
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=100+10;
char a[MAX],b[MAX];
int cnta[26],cntb[26];
int main(){while(scanf("%s%s",a,b)!=EOF){int s=strlen(a);memset(cnta,0,sizeof(cnta));memset(cntb,0,sizeof(cntb));for(int i=0;i<s;i++){cnta[a[i]-'A']++;cntb[b[i]-'A']++;}bool flag=false;sort(cnta,cnta+26);sort(cntb,cntb+26);for(int i=0;i<26;i++)if(cnta[i]!=cntb[i]){printf("NO\n");flag=true;break;}if(!flag)	printf("YES\n");}
}