Print Concatenation of Zig-Zag String in ‘n’ Rows

13 Sep, 2021
Given a string and number of rows ‘n’. Print the string formed by concatenating n rows when input string is written in row-wise Zig-Zag fashion.
Examples: 
Input: str = "ABCDEFGH"
       n = 2
Output: "ACEGBDFH"
Explanation: Let us write input string in Zig-Zag fashion
             in 2 rows.
A   C   E   G   
  B   D   F   H
Now concatenate the two rows and ignore spaces 
in every row. We get "ACEGBDFH"

Input: str = "GEEKSFORGEEKS"
       n = 3
Output: GSGSEKFREKEOE
Explanation: Let us write input string in Zig-Zag fashion
             in 3 rows.
G       S       G       S
  E   K   F   R   E   K
    E       O       E
Now concatenate the two rows and ignore spaces 
in every row. We get "GSGSEKFREKEOE"
The idea is to traverse the input string. Every character has to go to one of the rows. One by one add all characters to different rows. Below is algorithm: 
1) Create an array of n strings, arr[n]
2) Initialize direction as "down" and row as 0. The 
   direction indicates whether we need to move up or 
   down in rows. 
3) Traverse the input string, do following for every
   character.
   a) Append current character to string of current row.
   b) If row number is n-1, then change direction to 'up'
   c) If row number is 0, then change direction to 'down'
   d) If direction is 'down', do row++.  Else do row--.
4) One by one print all strings of arr[]. 
Below is the implementation of above idea. 
C++
Java
Python3
C#
Javascript
// C++ program to print string obtained by concatenation// of different rows of Zig-Zag fashion #include<bits/stdc++.h>using namespace std; // Prints concatenation of all rows of str's Zig-Zag fashionvoid printZigZagConcat(string str, int n){    // Corner Case (Only one row)    if (n == 1)    {        cout << str;             return;    }       // Find length of string    int len = str.length();     // Create an array of strings for all n rows    string arr[n];     // Initialize index for array of strings arr[]    int row = 0;    bool down; // True if we are moving down in rows,               // else false     // Traverse through given string    for (int i = 0; i < len; ++i)    {        // append current character to current row        arr[row].push_back(str[i]);         // If last row is reached, change direction to 'up'        if (row == n-1)          down = false;         // If 1st row is reached, change direction to 'down'        else if (row == 0)          down = true;         // If direction is down, increment, else decrement        (down)? (row++): (row--);    }     // Print concatenation of all rows    for (int i = 0; i < n; ++i)        cout << arr[i];} // Driver programint main(){    string str = "GEEKSFORGEEKS";    int n = 3;    printZigZagConcat(str, n);    return 0;}
// Java program to print string// obtained by concatenation// of different rows of// Zig-Zag fashionimport java.util.Arrays; class GFG {     // Prints concatenation    // of all rows of str's    // Zig-Zag fashion    static void printZigZagConcat(String str,            int n)    {         // Corner Case (Only one row)        if (n == 1)        {            System.out.print(str);            return;        }        char[] str1 = str.toCharArray();         // Find length of string        int len = str.length();         // Create an array of        // strings for all n rows        String[] arr = new String[n];        Arrays.fill(arr, "");         // Initialize index for        // array of strings arr[]        int row = 0;        boolean down = true; // True if we are moving        // down in rows, else false         // Traverse through        // given string        for (int i = 0; i < len; ++i)        {            // append current character            // to current row            arr[row] += (str1[i]);             // If last row is reached,            // change direction to 'up'            if (row == n - 1)            {                down = false;            }                         // If 1st row is reached,            // change direction to 'down'            else if (row == 0)            {                down = true;            }             // If direction is down,            // increment, else decrement            if (down)            {                row++;            }            else            {                row--;            }        }         // Print concatenation        // of all rows        for (int i = 0; i < n; ++i)        {            System.out.print(arr[i]);        }    }     // Driver Code    public static void main(String[] args)    {        String str = "GEEKSFORGEEKS";        int n = 3;        printZigZagConcat(str, n);    }} // This code is contributed by PrinciRaj1992
# Python 3 program to print# string obtained by# concatenation of different# rows of Zig-Zag fashion # Prints concatenation of all# rows of str's Zig-Zag fashiondef printZigZagConcat(str, n):         # Corner Case (Only one row)    if n == 1:        print(str)            return     # Find length of string    l = len(str)     # Create an array of    # strings for all n rows    arr=["" for x in range(l)]     # Initialize index for    # array of strings arr[]    row = 0         # Traverse through    # given string    for i in range(l):                 # append current character        # to current row        arr[row] += str[i]         # If last row is reached,        # change direction to 'up'        if row == n - 1:            down = False         # If 1st row is reached,        # change direction to 'down'        elif row == 0:            down = True         # If direction is down,        # increment, else decrement        if down:            row += 1        else:            row -= 1     # Print concatenation    # of all rows    for i in range(n):        print(arr[i], end = "") # Driver Codestr = "GEEKSFORGEEKS"n = 3printZigZagConcat(str, n) # This code is contributed# by ChitraNayal
// C# program to print string// obtained by concatenation// of different rows of// Zig-Zag fashionusing System; class GFG{         // Prints concatenation    // of all rows of str's    // Zig-Zag fashion    static void printZigZagConcat(string str,                                  int n)    {             // Corner Case (Only one row)    if (n == 1)    {        Console.Write(str);            return;    }         char[] str1 = str.ToCharArray();         // Find length of string    int len = str.Length;     // Create an array of    // strings for all n rows    string []arr = new string[n];     // Initialize index for    // array of strings arr[]    int row = 0;    bool down = true; // True if we are moving                      // down in rows, else false     // Traverse through    // given string    for (int i = 0; i < len; ++i)    {        // append current character        // to current row        arr[row] += (str1[i]);         // If last row is reached,        // change direction to 'up'        if (row == n - 1)        down = false;         // If 1st row is reached,        // change direction to 'down'        else if (row == 0)        down = true;         // If direction is down,        // increment, else decrement        if(down)        row++;        else        row--;    }     // Print concatenation    // of all rows    for (int i = 0; i < n; ++i)        Console.Write(arr[i]);    }     // Driver Code    public static void Main()    {        String str = "GEEKSFORGEEKS";        int n = 3;        printZigZagConcat(str, n);    }} // This code is contributed// by ChitraNayal
<script>// Javascript program to print string// obtained by concatenation// of different rows of// Zig-Zag fashion // Prints concatenation    // of all rows of str's    // Zig-Zag fashionfunction printZigZagConcat(str,n){    // Corner Case (Only one row)        if (n == 1)        {            document.write(str);            return;        }        let str1 = str.split("");          // Find length of string        let len = str.length;          // Create an array of        // strings for all n rows        let arr = new Array(n);        for(let i=0;i<n;i++)        {            arr[i]="";        }                   // Initialize index for        // array of strings arr[]        let row = 0;        let down = true; // True if we are moving        // down in rows, else false          // Traverse through        // given string        for (let i = 0; i < len; ++i)        {            // append current character            // to current row            arr[row] += (str1[i]);              // If last row is reached,            // change direction to 'up'            if (row == n - 1)            {                down = false;            }                          // If 1st row is reached,            // change direction to 'down'            else if (row == 0)            {                down = true;            }              // If direction is down,            // increment, else decrement            if (down)            {                row++;            }            else            {                row--;            }        }          // Print concatenation        // of all rows        for (let i = 0; i < n; ++i)        {            document.write(arr[i]);        }} // Driver Codelet str = "GEEKSFORGEEKS";let n = 3;printZigZagConcat(str, n); // This code is contributed by ab2127</script>
GSGSEKFREKEOE
Time Complexity: O(len) where len is length of input string. Auxiliary Space: O(len)Thanks to Gaurav Ahirwar for suggesting above solution.
Another Approach:If we assume that we are iterating through imaginary matrix of row count n one by one and printing charsfor first and last row, index will increment by a value of i+= 2*(n-1) for middle rows, if we are going in upward direction, index will increment as i+= 2*(n-rowNum-1), and for downward direction, index will increment as 2*rowNum. Following is the working implementation. in JAVA
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ Program for above approach#include<bits/stdc++.h>using namespace std;// Function for zig-zag Concatenationstring zigZagConcat(string s, int n){    // Check is n is less    // or equal to 1    if (n <= 1)    {        return s;    }    string result = "";    // Iterate rowNum from 0 to n - 1    for (int rowNum = 0; rowNum < n; rowNum++)    {        int i = rowNum;        bool up = true;        // Iterate i till s.length() - 1        while (i < s.length())        {             result += s[i];             // Check is rowNum is 0 or n - 1            if (rowNum == 0 || rowNum == n - 1)            {                i += (2 * n - 2);            }            else            {                if (up)                {                    i += (2 * (n - rowNum) - 2);                }                else                {                    i += rowNum * 2;                }                up ^= true;            }        }    }    return result;} // Driver Codeint main(){    string str = "GEEKSFORGEEKS";    int n = 3;    cout<< zigZagConcat(str, n);} // This code is contributed by Mayank Tyagi
// Java Program for above approachimport java.lang.*; class Solution{         // Function for zig-zag Concatenation    private static String zigZagConcat(                                String s, int n)    {         // Check is n is less        // or equal to 1        if (n <= 1)        {            return s;        }         StringBuilder result = new                             StringBuilder();         // Iterate rowNum from 0 to n - 1        for (int rowNum = 0; rowNum < n; rowNum++)        {            int i = rowNum;            boolean up = true;                       // Iterate i till s.length() - 1            while (i < s.length())            {                 result = result.append(s.charAt(i));                               // Check is rowNum is 0 or n - 1                if (rowNum == 0 || rowNum == n - 1)                {                    i += (2 * n - 2);                }                else                {                    if (up)                    {                        i += (2 * (n - rowNum) - 2);                    }                    else                    {                        i += rowNum * 2;                    }                    up ^= true;                }            }        }        return result.toString();    }     // Driver Code    public static void main(String[] args)    {        String str = "GEEKSFORGEEKS";        int n = 3;        System.out.println(zigZagConcat(str, n));    }} // This code is contributed by Sakshi Sachdeva
# Python Program for above approach # Function for zig-zag Concatenationdef zigZagConcat(s, n):         # Check is n is less     # or equal to 1    if (n <= 1):        return s         result = ""         # Iterate rowNum from 0 to n - 1    for rowNum in range(n):        i = rowNum        up = True                 # Iterate i till s.length() - 1        while(i < len(s)):            result += s[i]                         # Check is rowNum is 0 or n - 1            if (rowNum == 0 or rowNum == n - 1):                i += (2 * n - 2)            else:                if(up):                    i += (2 * (n - rowNum) - 2)                else:                    i += rowNum * 2                up ^= True         return result # Driver Codestr = "GEEKSFORGEEKS"n = 3print(zigZagConcat(str, n)) # This code is contributed by rag2127
// C# Program for above approachusing System;public class GFG{   // Function for zig-zag Concatenation  static string zigZagConcat( string s, int n)  {    // Check is n is less     // or equal to 1    if (n <= 1)     {      return s;    }    string result="";    // Iterate rowNum from 0 to n - 1    for (int rowNum = 0; rowNum < n; rowNum++)    {      int i = rowNum;      bool up = true;      // Iterate i till s.length() - 1      while (i < s.Length)       {         result += s[i];         // Check is rowNum is 0 or n - 1        if (rowNum == 0 || rowNum == n - 1)         {          i += (2 * n - 2);        }        else        {          if (up)           {            i += (2 * (n - rowNum) - 2);          }          else          {            i += rowNum * 2;          }          up ^= true;        }      }    }    return result;  }    // Driver Code  static public void Main (){    string str = "GEEKSFORGEEKS";    int n = 3;    Console.WriteLine(zigZagConcat(str, n));  }} // This code is contributed by avanitrachhadiya2155
<script>// Javascript Program for above approach // Function for zig-zag Concatenationfunction zigZagConcat(s,n){     // Check is n is less        // or equal to 1        if (n <= 1)        {            return s;        }          let result = [];          // Iterate rowNum from 0 to n - 1        for (let rowNum = 0; rowNum < n; rowNum++)        {            let i = rowNum;            let up = true;                        // Iterate i till s.length() - 1            while (i < s.length)            {                  result.push(s[i]);                                // Check is rowNum is 0 or n - 1                if (rowNum == 0 || rowNum == n - 1)                {                    i += (2 * n - 2);                }                else                {                    if (up)                    {                        i += (2 * (n - rowNum) - 2);                    }                    else                    {                        i += rowNum * 2;                    }                    up ^= true;                }            }        }        return result.join("");} // Driver Codelet str = "GEEKSFORGEEKS";let n = 3;document.write(zigZagConcat(str, n)); // This code is contributed by unknown2108</script>
GSGSEKFREKEOE
Time Complexity: O(length)
Space Complexity: O(1)
Print Concatenation of Zig-Zag String in ‘n’ Rows | GeeksforGeeks - YouTubeGeeksforGeeks532K subscribersPrint Concatenation of Zig-Zag String in ‘n’ Rows | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 3:04•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=LhacuzXRVKI" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
Thanks to Sakshi Sachdeva for suggesting above solution.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
 
ukasp
princiraj1992
sakshi sachdeva
avanitrachhadiya2155
rag2127
mayanktyagi1709
ab2127
unknown2108
manikarora059
varshagumber28
surinderdawra388
PayPal
Strings
PayPal
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.