C++ 中打印 N 行之字形字符串的拼接


在这个问题中,我们给定一个字符串,它是一系列字符。我们还给定了之字形图案的长度,并且需要打印这个之字形字符串在 n 行中的拼接字符串。

让我们看几个例子来更好地理解这个概念,

示例

Input : string = ‘STUVWXYZ’ n = 2.
Output : SUWYTVXZ

解释 - 字符串的 2 行之字形图案如下:

S    U    W    Y
   T    V    X    Z

这个之字形图案的拼接是 - SUWYTVXZ。

示例

Input : string = ABCDEFGH n = 3
Output: ADGBEHCF

解释 - 字符串的 3 行之字形图案如下:

A    E
   B D F H
  C G

之字形图案的拼接是 - AEBDFHCG

现在我们知道了问题,让我们设计一个解决方案。在这里,我们将向下传播字符串的下一个元素,直到行数达到 n。然后向上传播直到行数变为零,然后再次向下。最后,打印每一行的结果以获得解决方案。

基于这个概念,让我们推导出一个可以解决问题的算法,

算法

Step 1 : Take an array of string of size n, string arr[n], row for current row no. i.e. string in the array and the direction as 1(indicating downward traversal).
Step 2 : Traverse the string and follow step 3 - 7. For every character of the string.
Step 3 : Append the character to the current string in the array based on the value of row.
Step 4 : If row = n-1, direction = 1.
Step 5 : if row = 0, direction = -1.
Step 6 : if direction = 1, row++ .
Step 7 : else row--.
Step 8 : print all string on the array from 0 to n-1 in sequence.

示例

现在基于这个算法创建一个程序来实现我们的解决方案 -

 在线演示

#include<bits/stdc++.h>
using namespace std;
void ZigZagConcatenationString(string str, int n){
   if (n == 1){
      cout << str;
      return;
   }
   int len = str.length();
   string arr[n];
   int row = 0;
   int direction = 1;
   bool down;
   for (int i = 0; i < len; ++i){
      arr[row].push_back(str[i]);
      if (row == n-1)
         direction = -1;
      else if (row == 0)
         direction = 1;
      (direction == 1)? (row++): (row--);
   }
   for (int i = 0; i < n; ++i)
      cout << arr[i];
}
int main(){
   string str = "ABCDEFGH";
   int n = 3;
   ZigZagConcatenationString(str, n);
   return 0;
}

输出

AEBDFHCG

更新于: 2020-01-03

326 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告