将给定字符串按列插入矩阵,然后按行打印。
在这个问题中,我们将通过按列将字符串插入矩阵并按行打印字符串来对字符串进行编码。
解决这个问题的简单方法是创建一个矩阵,以自上而下的方式填充矩阵,然后按行打印字符串。第二个解决方案是使用向量存储字符串并单独打印每个向量值。在这里,我们将学习解决这个问题的两种方法。
问题陈述 - 我们给定长度为 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),因为我们创建了一个字符串向量。
第二种方法在时间和空间复杂度方面提供了更好的性能。此外,第二种方法对于程序员来说更易于阅读,更容易理解向量。第一种方法对初学者非常友好。