一、题目
- 给你字符串
key
和message
,分别表示一个加密密钥和一段加密消息。解密message
的步骤如下:
- 使用
key
中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 - 将替换表与普通英文字母表对齐,形成对照表。
- 按照对照表 替换
message
中的每个字母。 - 空格
' '
保持不变。
- 例如,
key = "happy boy"
(实际的加密密钥会包含字母表中每个字母 至少一次),据此,可以得到部分对照表('h' -> 'a'
、'a' -> 'b'
、'p' -> 'c'
、'y' -> 'd'
、'b' -> 'e'
、'o' -> 'f'
)。返回解密后的消息。
二、示例
2.1> 示例1
【输入】key = "the quick brown fox jumps over the lazy dog", message = "vkbs bs t suepuv"
【输出】"this is a secret"
2.2> 示例2
【输入】key = "eljuxhpwnyrdgtqkviszcfmabo", message = "zwx hnfx lqantp mnoeius ycgk vcnjrdb"
【输出】"the five boxing wizards jump quickly"
提示:
26
<= key.length <=2000
key
由小写英文字母及 ' ' 组成key
包含英文字母表中每个字符('a'
到'z'
)至少一次1
<= message.length <=2000
message
由小写英文字母和 ' ' 组成
三、解题思路
- 根据题目描述,我们需要遍历字符串
key
,当遍历到第1个字符
并且是第1次出现的时候,那么它所对应的加密字符就是‘a
’,当遍历到第2个字符
并且是第1次出现的时候,那么它所对应的解密字符就是‘b
’,以此类推……所以,为了能够判断某个字符是否是第1次出现,则需要我们提前构建密码表dic
,key用于保存字符,value用于保存对应的解密字符。这样,当我们发现dic
表中已经存在对应的加密字符的话,则直接获取解密字符即可。 - 当我们遍历完字符串key中的所有字符之后,随之的字典表dic也创建完毕了。那么下一步骤,我们就可以遍历message执行解密操作了。
- 在上面的处理过程中,我们发现,很多算法题都需要涉猎字符与数字的相互转换,以及字符串与字符数组的转换,其转换方式如下所示:
- 字符——>数字
int num = item - 'a'; // 字符a对应数字0
- 数字——>字符
char chr = (char) (dic[c - 'a'] + 'a'); // 数字0对应字符a
- 字符数组——>字符串
char[] c = ...;
String s = new String(c);
- 字符串——>字符数组
String s = ...;
char[] c = s.toCharArray();
四、代码实现
classSolution { publicStringdecodeMessage(Stringkey, Stringmessage) { intv=1, len=message.length(); // v等于1,对应字符‘a’char[] result=newchar[len]; int[] dic=newint[26]; for (charitem : key.toCharArray()) // 构造密码字典映射if (item!=' '&&dic[item-'a'] ==0) dic[item-'a'] =v++; for (inti=0; i<len; i++) { // 执行解密操作charc=message.charAt(i); result[i] =c==' '?c : (char) (dic[c-'a'] +'a'-1); } returnnewString(result); } }
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」