將給定字串按列插入矩陣,然後按行列印。


在這個問題中,我們將透過按列將字串插入矩陣並按行列印字串來對字串進行編碼。

解決這個問題的簡單方法是建立一個矩陣,以自上而下的方式填充矩陣,然後按行列印字串。第二個解決方案是使用向量儲存字串並單獨列印每個向量值。在這裡,我們將學習解決這個問題的兩種方法。

問題陳述 - 我們給定長度為 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),因為我們建立了一個字串向量。

第二種方法在時間和空間複雜度方面提供了更好的效能。此外,第二種方法對於程式設計師來說更易於閱讀,更容易理解向量。第一種方法對初學者非常友好。

更新於:2023年8月24日

瀏覽量:112

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.