1. 题目描述
古罗马帝国有两种简单的加密算法,第一种按照顺序替换,例如把a-y 分别替换成b-z,
把z 替换成a,这样可以把VICTORIOUS 替换成WJDUPSJPVT。
第二种是打乱顺序消息的顺序,例如<2, 1, 5, 4, 3, 7, 6, 10, 9, 8>的含义就是把第二个字
符放在第一位,而把第一位的字符放到第二位,然后是第5 个字符,第4 个字符,…,可以
把VICTORIOUS 替换成IVOTCIRSUO。
后来发现同时使用两种算法, 加密效果更好。可以把VICTORIOUS 替换成
JWPUDJSTVP。
题目要求:能不能把第二行中的原文转换为第一行的密文。
输入格式
输入包括两行:第一行为加密后的密文,第二行原文。
输出格式
如果能够按此方法把第二行的原文转换为第一行的密文,则输出 YES,否则输出NO。
输入样例
JWPUDJSTVP
VICTORIOUS
输出样例
YES
2. 题目分析和算法实现
首先,要找出规律,第二种方法只会改变每个字符的位置,但是不会影响每个字符在字
符串中出现的次数。例如A 在原来的字符串中出现3 次,那么通过第二种算法它出现的次
数还是3 次。第一种算法虽然改变了字符串的内容,但是有些东西没有变化,例如原来字符
串中的a、b、c 出现的次数分别n1、n2、n3,假设abc 替换def,则d、e、f 出现的次数应
该是n1、n2、n3。所以只要保证相对位置上的字符出现的次数相同即可实现转换。
统计输入信息第一行中每个字符出现的次数。使用长度为26 的数组表示,分别表示字
母A 到字母Z 出现的次数,使用int[] a 表示。
统计输入信息第二行中的每个字符出现的次数。使用长度为26 的数组表示,分别表示
字母A 到字母Z 出现的次数,使用int[] b 表示。
我们循环26 次,第j 次循环中,再循环比较a[(i+j)%26]与b[i]是否相同,如果都相同则
说明能够转换,输出YES 即可,退出外层循环,否则继续循环。如果26 次循环完之后,没有得到结果,输出NO。
3. 问题实现及代码分析
4.结果