C++ 按列的方式将给定字符串编码并按行打印

C++ 按列的方式将给定字符串编码并按行打印

在这个问题中,我们将通过按照列的方式将字符串插入到矩阵中,并以行的方式打印字符串来进行编码。

解决这个问题的朴素方法是创建一个矩阵,按自上而下的方式填充矩阵,并按行打印字符串。第二种解决方案是使用向量来存储字符串,并逐个打印每个向量值。在这里,我们将学习解决这个问题的两种方法。

问题描述: 给定长度为N的字符串str,同时给定正整数rows。任务是对字符串进行编码并将其打印出来。为了编码字符串,我们需要将字符串填充到包含“row”行的二维数组中,并以行的方式打印字符串。

示例:

输入:

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 - 使用两个嵌套循环。第一个循环的迭代次数等于“cols”,第二个循环的迭代次数等于“rows”。

步骤 5 - 如果k是字符串长度,则将第k个字符赋给矩阵[q][p]。否则,将空格赋给矩阵。

步骤 6 - 现在,我们需要打印编码字符串。因此,创建一个final_str字符串变量。

步骤 7 - 使用两个嵌套循环以行顺序遍历矩阵。如果矩阵[p][q]不包含空格,则将矩阵[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(行数),因为我们创建了一个字符串向量。

从时间和空间复杂度的角度来看,第二种方法表现更好。此外,第二种方法对于程序员来说更易读,更容易理解向量。第一种方法非常适合初学者。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程