Print Concatenation of Zig-Zag String in 'n' Rows
Last Updated :
01 May, 2023
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++
// 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 fashion
void 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 program
int main()
{
string str = "GEEKSFORGEEKS";
int n = 3;
printZigZagConcat(str, n);
return 0;
}
Java
// Java program to print string
// obtained by concatenation
// of different rows of
// Zig-Zag fashion
import 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
Python3
# 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 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 = "GEEKSFORGEEKS"
n = 3
printZigZagConcat(str, n)
# This code is contributed
# by ChitraNayal
C#
// C# program to print string
// obtained by concatenation
// of different rows of
// Zig-Zag fashion
using 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
JavaScript
<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 fashion
function 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 Code
let str = "GEEKSFORGEEKS";
let n = 3;
printZigZagConcat(str, n);
// This code is contributed by ab2127
</script>
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 chars
for 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++
// C++ Program for above approach
#include<bits/stdc++.h>
using namespace std;
// Function for zig-zag Concatenation
string zigZagConcat(string s, int n)
{
// Check if 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 if 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
int main()
{
string str = "GEEKSFORGEEKS";
int n = 3;
cout<< zigZagConcat(str, n);
}
// This code is contributed by Mayank Tyagi
Java
// Java Program for above approach
import java.lang.*;
class Solution
{
// Function for zig-zag Concatenation
private static String zigZagConcat(
String s, int n)
{
// Check if 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 if 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
Python3
# Python Program for above approach
# Function for zig-zag Concatenation
def zigZagConcat(s, n):
# Check if 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 if 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 Code
str = "GEEKSFORGEEKS"
n = 3
print(zigZagConcat(str, n))
# This code is contributed by rag2127
C#
// C# Program for above approach
using System;
public class GFG{
// Function for zig-zag Concatenation
static string zigZagConcat( string s, int n)
{
// Check if 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 if 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
JavaScript
<script>
// Javascript Program for above approach
// Function for zig-zag Concatenation
function zigZagConcat(s,n)
{
// Check if 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 if 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 Code
let str = "GEEKSFORGEEKS";
let n = 3;
document.write(zigZagConcat(str, n));
// This code is contributed by unknown2108
</script>
Time Complexity: O(length)
Space Complexity: O(1)
Thanks to Sakshi Sachdeva for suggesting above solution.
Similar Reads
Concatenation of Zig-Zag String in N Rows 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 t
6 min read
Maximum Strings Concatenation Given an array of strings, where each string consists of lowercase characters from a to j. You need to find the maximum number of strings that can be concatenated together such that the resulting string can be made out of exactly k distinct characters. Example: Input: n = 4, str = [ "abc", "de", "fg
8 min read
Python | Permutation of a given string using inbuilt function The task is to generate all the possible permutations of a given string. A permutation of a string is a rearrangement of its characters. For example, the permutations of "ABC" are "ABC", "ACB", "BAC", "BCA", "CAB", and "CBA". The number of permutations of a string with n unique characters is n! (fac
2 min read
Reorder the given string to form a K-concatenated string Given a string S and an integer K. The task is to form a string T such that the string T is a reordering of the string S in a way that it is a K-Concatenated-String. A string is said to be a K-Concatenated-String if it contains exactly K copies of some string.For example, the string "geekgeek" is a
8 min read
Program to print a string in vertical zigzag manner Given a string, S of size N, and a number of rows R, the task is to print the given string in a vertical zigzag fashion with respect to the given number of rows as shown in the examples. Examples: Input: S = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", R = 9Output: Input: S = "At
7 min read