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++ 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 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
# 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# 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.
<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>
Output
PAHNAPLSIIGYIR
Time Complexity: O(N)
Auxiliary Space: O(N)