將給定字串按列插入矩陣,然後按行列印。
在這個問題中,我們將透過按列將字串插入矩陣並按行列印字串來對字串進行編碼。
解決這個問題的簡單方法是建立一個矩陣,以自上而下的方式填充矩陣,然後按行列印字串。第二個解決方案是使用向量儲存字串並單獨列印每個向量值。在這裡,我們將學習解決這個問題的兩種方法。
問題陳述 - 我們給定長度為 N 的字串 str。我們還給定了正整數行數。任務是對字串進行編碼並在輸出中列印它。為了對字串進行編碼,我們需要將字串填充到包含“行”行的二維陣列中,並按行列印字串。
示例
輸入
str = "TutorialsPoint", rows = 4
輸出
TrsnuiPttaooli
解釋 - 我們可以將字串填充到矩陣中,如下所示。
T r s n
u i P t
t a o
O l i
因此,當我們按行讀取字串時,我們得到 TrsnuiPttaooli。
輸入
str = "welcome", rows = 2
輸出
wloeecm
解釋 - 我們可以將字串填充到矩陣中,如下所示。
w l o e
e c m
輸入
str = ‘abcdefghijklmno’, row = 1
輸出
‘abcdefghijklmno’
解釋 - 由於行數為 1,編碼後的字串與原始字串相同。
方法 1
在這種方法中,我們將根據給定的字串大小和行數確定所需的列數。之後,我們將使用所需維度的矩陣,並以自上而下的方式填充字串。為了獲得編碼後的字串,我們將以從左到右的方式遍歷矩陣。
演算法
步驟 1 - 將字串長度除以行數,並取其向上取整的值,表示矩陣中的總列數。
步驟 2 - 定義維度等於行數和列數的矩陣。
步驟 3 - 將 k 初始化為 0,這是一個字串指標。
步驟 4 - 使用兩個巢狀迴圈。第一個迴圈進行等於“列”的迭代,第二個迴圈進行等於“行”的迭代。
步驟 5 - 如果 k 等於字串長度,則將第 k 個字元賦值給 matrix[q][p]。否則,將空格賦值給矩陣。
步驟 6 - 現在,我們需要列印編碼後的字串。因此,建立一個 final_str 字串變數。
步驟 7 - 使用兩個巢狀迴圈按行遍歷矩陣。如果 matrix[p][q] 不包含空格,則將 matrix[p][q] 值推入 final_Str。
步驟 8 - 返回 final_str 變數值,表示編碼後的字串。
示例
#include <bits/stdc++.h>
using namespace std;
// Encoding the string
string getEncodedString(string str, int rows) {
// finding required columns
int cols = ceil((float)str.length() / rows);
// Matrix of size rows*cols
int matrix[rows][cols];
// Inserting strings to the matrix in top to bottom manner
int k = 0;
for (int p = 0; p < cols; p++) {
for (int q = 0; q < rows; q++) {
// If all characters are traversed, add space to matrix
if (k < str.length()) {
matrix[q][p] = str[k++];
} else {
matrix[q][p] = ' ';
}
}
}
string final_str;
// Getting the encoded string
for (int p = 0; p < rows; p++) {
for (int q = 0; q < cols; q++) {
// If we find space, we need to ignore it
if (matrix[p][q] != ' '){
final_str.push_back(matrix[p][q]);
}
}
}
return final_str;
}
int main() {
string str = "Tutorials Point";
int rows = 2;
cout << "The encoded string is " << getEncodedString(str, rows);
return 0;
}
輸出
The encoded string is TtrasPituoilon
時間複雜度 - O(N),因為我們遍歷字串以將其插入矩陣。
空間複雜度 - O(N),因為我們將字串儲存在矩陣中。
方法 2
此方法將建立一個大小等於行數的字串向量。我們將遍歷字串並將原始字串的每個字元追加到向量的特定字串中,以便我們可以正確地對字串進行編碼。
演算法
步驟 1 - 定義一個名為“matrix”的向量,其大小等於“rows”。另外,定義“final_str”字串變數來儲存編碼後的字串。
步驟 2 - 開始遍歷字串。使用 push_back() 方法將字串的當前字元追加到 matrix[p % rows]。在這裡,我們根據 p 值選擇行號。
步驟 3 - 現在,遍歷字串向量以獲取編碼後的字串。
步驟 4 - 使用巢狀迴圈遍歷向量中索引為 I 的每個字串字元。取一個字元並將其追加到 fina_Str 字串。
步驟 5 - 最後,返回 final_str 字串。
示例
#include <bits/stdc++.h>
using namespace std;
// Encoding the string
string getEncodedString(string str, int rows) {
vector<string> matrix(rows);
string final_str;
// Inserting strings to the matrix
for (int p = 0; p < str.length(); p++) {
matrix[p % rows].push_back(str[p]);
}
// Getting the encoded string
for (int p = 0; p < rows; p++) {
for (int q = 0; q < matrix[p].size(); q++) {
final_str.push_back(matrix[p][q]);
}
}
return final_str;
}
int main() {
string str = "TutorialsPoint";
int rows = 4;
cout << "The encoded string is " << getEncodedString(str, rows);
return 0;
}
輸出
The encoded string is TrsnuiPttaooli
時間複雜度 - O(N),因為我們遍歷字串。
空間複雜度 - O(rows),因為我們建立了一個字串向量。
第二種方法在時間和空間複雜度方面提供了更好的效能。此外,第二種方法對於程式設計師來說更易於閱讀,更容易理解向量。第一種方法對初學者非常友好。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP