Saturday, December 28, 2024
Google search engine
HomeData Modelling & AIConcatenation of Zig-Zag String in N Rows

Concatenation of Zig-Zag String in N Rows

The stringPAYPALISHIRING” 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: PAHNAPLSIIGYIR

Input: 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>


Output

PAHNAPLSIIGYIR

Time Complexity: O(N)
Auxiliary Space: O(N)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments