UVA1339
2026/7/2 3:01:37 网站建设 项目流程

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}BA,CB,,ZY,AZ),得到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();}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询