问题描述
小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来解密。这种方法简单直接,适用于本题。但我们也可以使用字典来存储加密字符与解密字符之间的映射关系。字典方法更具灵活性,并且可以扩展到其他字符集。