The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line: PAHNAPLSIIGYIR.
Therefore, for given string str and an integer N, the task is to print the string formed by concatenating N rows when str is written in row-wise Zig-Zag fashion.
Example:
Input: str = “PAYPALISHIRING”, N = 3
Output: PAHNAPLSIIGYIRInput: str = “ABCDEFGH”, N = 2
Output: ACEGBDFH
Explanation: The input string can be written in Zig-Zag fashion in 2 rows as follows:
A C E G
B D F H
Hence, upon reading the above pattern row-wise, the output string is “ACEGBDFH”
Approach: The given problem is an implementation based problem that can be solved by following the below steps
- Create an array of N strings, arr[N].
- Initialize direction as “down” and row as 0. The direction indicates whether the current pointer is moving up or down in rows.
- Traverse the input string, do the following for every character.
- Append the current character to the string representing the current row.
- If row number is N – 1, then change direction to ‘up’
- If row number is 0, then change direction to ‘down’
- If direction is ‘down’, do row++. Else do row–.
- One by one print all strings of arr[].
Below is the implementation of the above approach:
C++
// C++ code for the above approach #include <bits/stdc++.h> using namespace std; // Function that Prints concatenation of // all rows of str's Zig-Zag fashion void printZigZagConcat(string str, int n) { if (n == 1) { cout << str << endl; } string res = "" ; string arr[n] = { "" }; bool down; int row = 0; // helps in building individual blocks of strings for ( int i = 0; i < str.size(); i++) { arr[row].push_back(str[i]); if (row == n - 1) { down = false ; } if (row == 0) { down = true ; } if (!down) row--; else row++; } for ( int i = 0; i < n; i++) { cout << arr[i]; } } int main() { // Driver Code string str = "PAYPALISHIRING" ; int N = 3; printZigZagConcat(str, N); return 0; } // This code is contributed by Potta Lokesh |
Java
// Java code for the above approach import java.util.*; class GFG { // Function that Prints concatenation of // all rows of str's Zig-Zag fashion static void printZigZagConcat(String str, int n) { if (n == 1 ) { System.out.print(str + "\n" ); } String res = "" ; String[] arr = new String[n]; for ( int i = 0 ; i < n; i++) arr[i] = "" ; boolean down = false ; int row = 0 ; // helps in building individual blocks // of Strings for ( int i = 0 ; i < str.length(); i++) { if (row >= 0 ) arr[row] += (str.charAt(i)); if (row == n - 1 ) { down = false ; } if (row == 0 ) { down = true ; } if (!down) row--; else row++; } for ( int i = 0 ; i < n; i++) { System.out.print(arr[i]); } } public static void main(String[] args) { // Driver Code String str = "PAYPALISHIRING" ; int N = 3 ; printZigZagConcat(str, N); } } // This code is contributed by umadevi9616 |
Python3
# Python 3 program of the above approach # Function that Prints concatenation of # all rows of str's Zig-Zag fashion def 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 Code str = "PAYPALISHIRING" N = 3 printZigZagConcat( str , N) |
C#
// C# program to implement above approach using System; using System.Collections; using System.Collections.Generic; class GFG { // Function that Prints concatenation of // all rows of str's Zig-Zag fashion static void printZigZagConcat(String str, int n) { if (n == 1) { Console.WriteLine(str); } String[] arr = new String[n]; for ( int i = 0 ; i < n ; i++) arr[i] = "" ; bool down = false ; int row = 0; // helps in building individual blocks // of Strings for ( int i = 0 ; i < str.Length ; i++) { if (row >= 0) arr[row] += (str[i]); if (row == n - 1) { down = false ; } if (row == 0) { down = true ; } if (!down) row--; else row++; } for ( int i = 0; i < n; i++) { Console.Write(arr[i]); } } // Driver code public static void Main( string [] args){ // Driver Code String str = "PAYPALISHIRING" ; int N = 3; printZigZagConcat(str, N); } } // This code is contributed by subhamgoyal2014. |
Javascript
<script> // JavaScript code for the above approach // Function that Prints concatenation of // all rows of str's Zig-Zag fashion const printZigZagConcat = (str, n) => { if (n == 1) { document.write(`${str}<br/>`); } let res = "" ; let arr = new Array(n).fill( "" ); let down = false ; let row = 0; // helps in building individual blocks of strings for (let i = 0; i < str.length; i++) { arr[row] += str[i]; if (row == n - 1) { down = false ; } if (row == 0) { down = true ; } if (!down) row--; else row++; } for (let i = 0; i < n; i++) { document.write(arr[i]); } } // Driver Code let str = "PAYPALISHIRING" ; let N = 3; printZigZagConcat(str, N); // This code is contributed by rakeshsahni </script> |
PAHNAPLSIIGYIR
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!