使用給定的加密解密技術,藉助矩陣解密編碼後的字串。
在這個問題中,我們需要透過對矩陣進行對角線遍歷來解密給定的密文。我們可以透過對矩陣進行對角線遍歷來解決問題。此外,我們只需要對矩陣的上半部分進行對角線遍歷即可獲得解密後的字串。
問題陳述 – 我們給定了一個長度為 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),用於儲存解密後的字串。
問題的目的是讓程式設計師學習如何對矩陣進行對角線遍歷。在這裡,我們假設一個字串被插入到矩陣中,我們對其進行對角線遍歷,但程式設計師可以使用相同的方法對真正的矩陣進行對角線遍歷。