使用给定的加密解密技术,借助矩阵解密编码后的字符串。
在这个问题中,我们需要通过对矩阵进行对角线遍历来解密给定的密文。我们可以通过对矩阵进行对角线遍历来解决问题。此外,我们只需要对矩阵的上半部分进行对角线遍历即可获得解密后的字符串。
问题陈述 – 我们给定了一个长度为 N 的加密字符串和行数。我们需要将字符串以行方式放入矩阵中。然后,我们需要从 [0, 0] 索引开始对矩阵进行对角线遍历,以解密字符串。
示例
输入
str = "TRSI_ _ _UIPN _ _ _TAOT_ _ _ OL", totalRows = 4
输出
TUTORIALSPOINT
解释 – 我们可以将字符串以行方式放入矩阵中,如下所示。
T |
R |
S |
I |
||
U |
I |
P |
N |
||
T |
A |
O |
T |
||
O |
L |
要解密字符串,我们可以对其进行对角线遍历,如下所示。
T -> U -> T -> O -> R -> I -> A -> L -> S -> P -> O -> I -> N -> T
输入
str = "WCE_ _EO_ _ _LM"; totalRows = 3
输出
'WELCOME'
解释 – 加密字符串的矩阵如下所示。
W |
C |
E |
|
E |
O |
||
L |
M |
要解密字符串,我们可以对其进行对角线遍历,如下所示。
W -> E -> L -> C -> O -> M -> E
方法 1
在这种方法中,我们将使用两个嵌套循环来遍历字符串,就像我们遍历二维数组一样。我们将从字符串中选择字符,使其与我们以对角线方式从矩阵中选择字符的方式相同。
算法
步骤 1 – 使用加密字符串大小初始化 N。
步骤 2 – 通过将 N 除以总行数来获取矩阵总列数。
步骤 3 – 定义明文字符串以存储解密后的字符串。
步骤 4 – 使用循环从 0 到总列数进行迭代。
步骤 5 – 使用嵌套循环从第 p 个索引开始迭代到 N。此外,将 q 的值增加 totalColumns + 1 以在对角线遍历时转到下一行。
步骤 6 – 将 cipher[q] 附加到明文的末尾。
步骤 7 – 删除明文末尾的所有空格。
步骤 8 – 返回明文值。
示例
#include <bits/stdc++.h> using namespace std; string getPlainText(string cipher, int totalRows){ // Get string size int N = cipher.size(); // Get total columns int totalColumns = ceil(N / (float)totalRows); // String to store plain text string plainText; // Traverse matrix to encode the string for (int p = 0; p < totalColumns; ++p){ for (int q = p; q < N; q += totalColumns + 1){ // Append character to string plainText += cipher[q]; } } // Remove all spaces. while (plainText.back() == ' ') { plainText.pop_back(); } return plainText; } int main(){ string str = "TRSI UIPN TAOT OL"; int totalRows = 4; cout << "The decoded string is - " << getPlainText(str, totalRows) << endl; return 0; }
输出
The decoded string is - TUTORIALSPOINT
时间复杂度 – O(N),因为我们遍历了字符串。
空间复杂度 – O(N),用于存储解密后的字符串。
问题的目的是让程序员学习如何对矩阵进行对角线遍历。在这里,我们假设一个字符串被插入到矩阵中,我们对其进行对角线遍历,但程序员可以使用相同的方法对真正的矩阵进行对角线遍历。