1. Problem Statement (Simple Explanation):
You are given:
A string s
An integer numRows
You write the characters of s in a zigzag pattern across numRows rows, and then read the characters row by row to form a new string.
You need to return that new string.
2. Examples:
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Explanation:
Zigzag pattern (3 rows):
P A H N
A P L S I I G
Y I R
Read row by row → "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
Zigzag pattern (4 rows):
P I N
A L S I G
Y A H R
P I
Read row by row → "PINALSIGYAHRPI"
Example 3:
Input: s = "A", numRows = 1
Output: "A"
Explanation:
Only one row, so the result is the same string.
3. Key Observations:
When numRows == 1 or numRows >= len(s), there is no zigzag effect; return s directly.
The characters “go down” row by row, then “go up diagonally” and repeat:
Row sequence goes: 0,1,2,...,numRows-1,numRows-2,...,1,0,...
We can simulate the process:
Maintain a buffer string for each row.
Traverse the input characters while moving a pointer currentRow up and down.
4. Approach 1 – Simulation with Row Strings (Recommended):
Intuition:
Create an array/list of strings, one per row.
Start at row 0, direction “down”.
For each character:
Append it to the current row’s string.
If we’re at the top row, change direction to “down”.
If we’re at the bottom row, change direction to “up”.
Move currentRow accordingly.
At the end, concatenate all row strings.
This directly simulates the zigzag writing.
Algorithm (Step-by-Step):
If numRows == 1 or numRows >= len(s), return s.
Initialize an array rows of min(numRows, len(s)) empty strings.
Set:
currentRow = 0
goingDown = false
For each character c in s:
Append c to rows[currentRow].
If currentRow == 0 or currentRow == numRows - 1, flip goingDown (toggle).
If goingDown == true, currentRow++, else currentRow--.
Join all strings in rows and return the result.
Pseudo-code (Simulation):
Time and Space Complexity:
Let n=len(s).
Time: O(n)
We visit each character exactly once and append it.
Space: O(n)
for storing the output + row buffers.
This is efficient for n≤1000 and is the standard solution.
5. (Optional) Approach 2 – Index Arithmetic / Row Skipping:
We can compute row-by-row indices using cycle length:
For row 0 and last row, jump by full cycles.
For middle rows, there are two positions per cycle.
But this is more complex to explain; the simulation approach is clearer and perfectly efficient for constraints.
6. Java code:
9. Python code:
10. JavaScript code:






Comments
Post a Comment