Concatenation of ZigZag String in N Rows (original) (raw)
Last Updated : 23 Jul, 2025
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>``
Time Complexity: O(N)
Auxiliary Space: O(N)