图解LeetCode——2325. 解密消息(难度:简单)

一、题目

给你字符串 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次出现,则需要我们提前构建密码表dickey用于保存字符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();

四、代码实现

class Solution {
    public String decodeMessage(String key, String message) {
        int v = 1, len = message.length(); // v等于1,对应字符‘a’
        char[] result = new char[len];
        int[] dic = new int[26];  
        for (char item : key.toCharArray()) // 构造密码字典映射
            if (item != ' ' && dic[item - 'a'] == 0) dic[item - 'a'] = v++;
        for (int i = 0; i < len; i++) { // 执行解密操作
            char c = message.charAt(i);
            result[i] = c == ' ' ? c : (char) (dic[c - 'a'] + 'a' - 1);
        }
        return new String(result);
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值