UVA1339 古老的密码 Ancient Cipher
题目描述
给定两个长度相同且不超过100100100的字符串(仅由大写字母构成),判断是否能把其中一个字符串的各个字母重排,然后对262626个字母做一个一一映射,使得两个字符串相同。
若可以输出YES\texttt{YES}YES,否则输出NO\texttt{NO}NO。
输入格式
本题多测。
每个测试点内有不定数量个数据,以EOF\text{EOF}EOF为结尾。
对于每一组数据,输入两行,每行分别为一个字符串。
输出格式
对于每一组数据,输出一行,每行一个字符串表示是否可以达到。
输入输出样例 #1
输入 #1
JWPUDJSTVP VICTORIOUS MAMA ROME HAHA HEHE AAA AAA NEERCISTHEBEST SECRETMESSAGES输出 #1
YES NO YES YES NO说明/提示
Translated by user 726139。
样例解释
对于样例中的第一组数据,JWPUDJSTVP\texttt{JWPUDJSTVP}JWPUDJSTVP重排后可以得到WJDUPSJPVT\texttt{WJDUPSJPVT}WJDUPSJPVT,然后把每个字母映射到它的前一个字母(即B→A,C→B,⋯ ,Z→Y,A→Z\texttt{B}\to\texttt{A},\texttt{C}\to\texttt{B},\cdots,\texttt{Z}\to\texttt{Y},\texttt{A}\to\texttt{Z}B→A,C→B,⋯,Z→Y,A→Z),得到VICTORIOUS\texttt{VICTORIOUS}VICTORIOUS。
解题思路
题目允许将任意一个字符串打乱重排,再为 26 个大写字母建立一对一映射,判断能否让两个字符串完全相同,等价于两个字符串统计各字母出现次数得到的 26 位频次数组,排序后完全一致。解题流程为循环读取成对字符串直至输入结束,分别统计两组字符串中 A-Z 每个字母的出现次数存入两个长度 26 的数组,对两个频次数组升序排序后逐位对比,全部数值相等则输出 YES,存在数值不同则输出 NO。
完整代码
importjava.util.Arrays;importjava.util.Scanner;publicclassAncientCipher{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);while(sc.hasNext()){Stringstr1=sc.nextLine();Stringstr2=sc.nextLine();int[]count1=newint[26];int[]count2=newint[26];for(inti=0;i<str1.length();i++){charc1=str1.charAt(i);intidx1=c1-'A';count1[idx1]++;}for(inti=0;i<str2.length();i++){charc2=str2.charAt(i);intidx2=c2-'A';count2[idx2]++;}Arrays.sort(count1);Arrays.sort(count2);booleanflag=true;for(inti=0;i<26;i++){if(count1[i]!=count2[i]){flag=false;break;}}System.out.println(flag?"YES":"NO");}sc.close();}}