题目描述
输入描述
两行字符串。
第一行为密钥单词(长度小于等于 25 )。
第二行为待加密字符串(长度小于等于 50 )。
两行字符串末尾都有一个回车换行符,并且两行字符串均为小写字母,不含其它字符。
输出描述
输出加密后的字符串。
输入样例
youandme
welcometohangzhou
输出样例
vbrmmomvugnagzguu
运行限制
最大运行时间:1s
最大运行内存: 256M
算法
(字符串,模拟)
直接上代码,这题没什么算法,重在代码的实现
思路
1、先把建立一个5X5的数组a[5][5],同时建立一个长度为25的数组b[25];
2、将密钥先填入数组a,然后根据第三部完善数组a中其他数;
3、通过chr()和ord()的方法算出‘a’、’b’、‘c’、、、、,判断数组b中是否含有这个字符,如果有,跳过,如果没有则数组a添加这个字符;
4.根据上面几步的结果更新数组b;
4、根据每种情况设置if判断;
5、将符合条件变换得到的字符添加到一个新数组end中;
6、遍历完待加密的字符串后,将end数组转换为字符串。
import os
import sys
str1=input() //输入密钥
str2=input() //输入代加密字符串
m=[[0]*5 for i in range(5)] //创建5*5二维数组
for i in range(len(str1)): //把密钥存入二维数组
m[i//5][i%5]=str1[i]
a='a'
for i in range(len(str1),25): //完成思路中的第三部,更新好二维数组
while a in str1:
a=chr(ord(a)+1)
m[i//5][i%5]=a
a=chr(ord(a)+1)
query=[] //创建一个长度为25的数组query,方便后面判断所取的一对字母中有没有不在数组中
for i in range(len(m)):
for j in range(len(m[i])):
query.append(m[i][j])
end=[] //创建新数组end,将符合条件变换得到的字符添加到一个新数组end中
for i in range(0,len(str2)-1,2): //通过if语句判断所有情况
if str2[i]==str2[i+1]:
end.append(str2[i])
end.append(str2[i+1])
elif str2[i] not in query or str2[i+1] not in query:
end.append(str2[i])
end.append(str2[i+1])
else:
a,b,c,d=0,0,0,0
for x in range(len(m)):
for y in range(len(m[x])):
if str2[i]==m[x][y]:
a,b=x,y
if str2[i+1]==m[x][y]:
c,d=x,y
if a==c or b==d:
end.append(str2[i+1])
end.append(str2[i])
else:
end.append(m[a][d])
end.append(m[c][b])
if len(str2)%2==1: //判断是否有落单的字母
end.append(str2[-1])
print(''.join(end)) //遍历完待加密的字符串后,将end数组转换为字符串