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(行数),因为我们创建了一个字符串向量。
从时间和空间复杂度的角度来看,第二种方法表现更好。此外,第二种方法对于程序员来说更易读,更容易理解向量。第一种方法非常适合初学者。