375题:字符串的加密解密 | 豆包MarsCode AI刷题

146 阅读3分钟

问题描述

小C定义了一种加密方式:对于给定的原始字符串 S,将其中每个字母替换为其三重后继,即字母表中该字母的后三个字母。字母 'a' 的三重后继是 'd',字母 'z' 的三重后继是 'c'。现在给定一个加密后的字符串 S',需要通过解密得出原始的字符串 S

例如,对于加密后的字符串 "def",其原始字符串应该是 "abc"

简单题解

我知道学过C和了解字符编码的都知道的一个解法,就是将其所有字符的ASCII码-3然后输出即可,就像这样。当然我们需要注意的是对'a','b','c'三个字符它们的ASCII码减3并不是'xyz',需要特殊处理一下。

例如:

  • 'd'的ASCII码是100,减去3得到97,对应的字符是'a'
  • 'e'的ASCII码是101,减去3得到98,对应的字符是'b'
  • 'f'的ASCII码是102,减去3得到99,对应的字符是'c'

以下是用python实现的过程。当然因为用的python实现,需要用ord做类型转化减3后,再转化回chr才可以正确执行,不然会有类型错误。

def solution(n: int, s: str) -> str:
    # write code here
    result=''
    for i in s:
        if i=='a':
            result+='x'
        elif i=='b':
            result+='y'
        elif i=='c':
            result+='z'
        else:
            result+=chr(ord(i)-3)
    return result

这样能正确的执行得出题解,基本上所有了解计算机编码的都知道可以这样解。该解法的时间复杂度是 O(n),其中 n 是字符串 s 的长度。因为我们需要遍历字符串中的每个字符,并进行相应的解密操作。对于每个字符,我们只做常数时间的计算,因此总的时间复杂度是 O(n)。

但我们也能用python玩点不一样的

想想我们原始的解密是怎么解密的——密码本对吧。那我们python有什么和密码本相似的呢?对,就是字典。

我们都知道python提供的数据结构中有字典,有key值,有value值。那我们就可以将key作为被加密的字符,value就是原始字符,同样的遍历后,将对应key值的value输出后同样可以得到题解。我们还可以将key和value值对换还可以变成加密字典。

你可能会说这样有什么用,对本题可能没用,甚至不如用ASCII码方便,但你可以将要解密的字符换成其他的,甚至标点符号都可以,就没有任何规律的都可以。比如我们可以将'a'对应到的可以是'?',或者是'@',哪怕是就只有它不变而其他的都变都可以。

以下是本题对应的解密字典:

decryption_dict={ 
    'a': 'x', 'b': 'y', 'c': 'z', 'd': 'a', 'e': 'b', 'f': 'c', 'g': 'd', 
    'h': 'e', 'i': 'f', 'j': 'g', 'k': 'h', 'l': 'i', 'm': 'j', 'n': 'k', 
    'o': 'l', 'p': 'm', 'q': 'n', 'r': 'o', 's': 'p', 't': 'q', 'u': 'r',
    'v': 's', 'w': 't', 'x': 'u', 'y': 'v', 'z': 'w' 
}

可以自己去试试看,对应的代码如下:

result = ''.join(decryption_dict[char] for char in s)

这种方法的时间复杂度也是 O(n),其中 n 是字符串 s 的长度。字典的查找操作是常数时间 O(1),因此遍历每个字符并进行字典查找,总的时间复杂度是 O(n)。

总结

基于字符的ASCII码进行加减运算,通过减去3来解密。这种方法简单直接,适用于本题。但我们也可以使用字典来存储加密字符与解密字符之间的映射关系。字典方法更具灵活性,并且可以扩展到其他字符集。