C++ 使用矩阵进行解密,根据给定的加密解密技术
在这个问题中,我们需要通过对矩阵进行对角线遍历来解密给定的密文。我们可以通过对矩阵进行对角线遍历来解决这个问题。此外,我们需要只对矩阵的上部分进行对角线遍历,以获取解密后的字符串。
问题陈述 - 我们已经给出了一个长度为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
方法
在这种方法中,我们将使用两个嵌套循环来遍历字符串,就像我们用来遍历2D数组一样。我们将选择字符串中的字符,使其与我们对矩阵选择字符的方式相同。
算法
步骤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),用于存储解密的字符串。
问题的目标是程序员应该学会沿对角线遍历矩阵。在这里,我们假设一个字符串被插入到矩阵中,我们沿对角线遍历它,但程序员可以使用相同的方法来沿对角线遍历真实矩阵。