📜  查找解密字符串的第 k 个字符|套装 – 2(1)

📅  最后修改于: 2023-12-03 15:26:39.290000             🧑  作者: Mango

查找解密字符串的第 k 个字符|套装 – 2

在加密通信时,经常使用一些算法来保护数据的安全。这些算法通常使用一些秘密的密钥来加密和解密数据。在本题中,我们假设有一个加密算法,它将输入字符串中的每个字符替换为另一个字符。这种替换方式是使用一个长度为 $N$ 的密钥表完成的。密钥表是一个包含了 $N$ 个大小写拉丁字母的排列,其中每个字母恰好出现一次。密钥表的顺序是事先确定的,并且在加密和解密的过程中都是不变的。

具体来说,对于输入字符串 $S$,我们可以通过以下方式进行加密:

  1. 将 $S$ 中的每个小写字母替换为其在密钥表中的对应字母。
  2. 将 $S$ 中的每个大写字母替换为其在密钥表中的对应字母的大写形式。
  3. 参数 $k$ 指明了要查找的解密后的字符串 $S'$ 中的位置。请你编写一个函数来查找 $S'$ 的第 $k$ 个字符。

以下是函数的接口:

def find_kth_char_in_decrypted_string(N: int, S: str, K: int) -> str:
    pass

输入描述:

  • 第一行输入数据组数 $T$ ( $T \leq 10$ )
  • 对于每一组数据,第一行是字符串长度 $N$ ( $1 \leq N \leq 10^6$ ),和参数 $K$ ( $1 \leq K \leq 10^{18}$ )。第二行是字符串 $S$,其中只包含大小写字母。

输出描述:

  • 对于每一组数据,输出一个字符表示解密后字符串 $S'$ 的第 $K$ 个字符。

示例:

输入:

2
26 4
ojwcmaqjtkthuluuyhidbttsaa
26 1
fcrxzwscanmligyxyvym

输出:

i
f
解题思路

本题是一道纯字符串问题,但是如果都使用暴力方法,则会超时。首先,我们可以发现本题是通过一个固定的密钥表加密和解密的。因此,我们可以将密钥表逆序生成一张解密表,并将密钥表和解密表映射表分别构建出来。具体而言,我们将密钥表中的每个字符 $c_i$ 与解密表中的第 $i$ 个字符建立映射关系。同时,为了快速查找,我们将密钥表映射表构建成一个哈希表,其中每个表项都包含该字符出现的所有位置。这样,我们就可以直接通过密钥表中的字符查找其在解密表中的位置。接下来,我们可以按照正常的解密过程,逆序遍历字符串 $S$,根据字符串中每个字符在密钥表和解密表中的对应关系来还原出解密后的字符串 $S'$。

由于我们只需要计算 $S'$ 的任意一个字符,因此可以在遍历 $S$ 的同时计数,直接返回第 $k$ 个字符即可。

代码实现