Skip to content

Commit e4d2354

Browse files
authored
Merge pull request #10 from SamehElalfi/pr/b14f-solve-the-proble
feat: Add LeetCode Problem #6 - Zigzag Conversion
2 parents 56f5ad3 + 8b9e50b commit e4d2354

File tree

5 files changed

+750
-70
lines changed

5 files changed

+750
-70
lines changed
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# Problem #6 - Zigzag Conversion
2+
3+
**Difficulty:** Medium
4+
**LeetCode Link:** [Zigzag Conversion](https://leetcode.com/problems/zigzag-conversion/)
5+
6+
## Problem Description
7+
8+
The string `"PAYPALISHIRING"` is written in a zigzag pattern on a given number of rows like this:
9+
10+
```
11+
P A H N
12+
A P L S I I G
13+
Y I R
14+
```
15+
16+
And then read line by line: `"PAHNAPLSIIGYIR"`
17+
18+
Write the code that will take a string and make this conversion given a number of rows.
19+
20+
### Constraints
21+
22+
- `1 <= s.length <= 1000`
23+
- `s` consists of English letters (lower-case and upper-case), `','` and `'.'`
24+
- `1 <= numRows <= 1000`
25+
26+
## Examples
27+
28+
### Example 1
29+
30+
```
31+
Input: s = "PAYPALISHIRING", numRows = 3
32+
Output: "PAHNAPLSIIGYIR"
33+
34+
Visual representation:
35+
P A H N
36+
A P L S I I G
37+
Y I R
38+
```
39+
40+
### Example 2
41+
42+
```
43+
Input: s = "PAYPALISHIRING", numRows = 4
44+
Output: "PINALSIGYAHRPI"
45+
46+
Visual representation:
47+
P I N
48+
A L S I G
49+
Y A H R
50+
P I
51+
```
52+
53+
### Example 3
54+
55+
```
56+
Input: s = "A", numRows = 1
57+
Output: "A"
58+
```
59+
60+
## Approach
61+
62+
### Approach 1: Row-by-Row Simulation (Optimal)
63+
64+
Simulate the zigzag pattern by tracking which row each character belongs to.
65+
66+
**Algorithm:**
67+
68+
1. Create an array of strings, one for each row
69+
2. Iterate through the input string character by character
70+
3. Track the current row and direction (going down or up)
71+
4. Add each character to its corresponding row
72+
5. Change direction when hitting the top (row 0) or bottom (row numRows-1)
73+
6. Concatenate all rows to get the result
74+
75+
**Visual Example (numRows = 4):**
76+
77+
```
78+
Index: 0 1 2 3 4 5 6 7 8 9 ...
79+
Row: 0 1 2 3 2 1 0 1 2 3 ...
80+
Direction: ↓ ↓ ↓ ↓ ↑ ↑ ↑ ↓ ↓ ↓ ...
81+
```
82+
83+
- **Time Complexity:** O(n) - visit each character once
84+
- **Space Complexity:** O(n) - store all characters in row arrays
85+
86+
### Approach 2: Mathematical Index Calculation
87+
88+
Instead of simulating, calculate which characters belong to each row using index patterns.
89+
90+
**Key Insight:**
91+
92+
- The zigzag pattern has a cycle length of `2 * numRows - 2`
93+
- For row `i`, characters appear at indices:
94+
- `i, i + cycleLen, i + 2*cycleLen, ...` (downward part)
95+
- `cycleLen - i, 2*cycleLen - i, ...` (upward part, for middle rows only)
96+
97+
**Example (numRows = 4, cycleLen = 6):**
98+
99+
```
100+
Row 0: indices 0, 6, 12, ... (only downward)
101+
Row 1: indices 1, 5, 7, 11, 13, ... (both directions)
102+
Row 2: indices 2, 4, 8, 10, 14, ... (both directions)
103+
Row 3: indices 3, 9, 15, ... (only downward)
104+
```
105+
106+
- **Time Complexity:** O(n) - visit each character once
107+
- **Space Complexity:** O(n) - for result string (O(1) extra working space)
108+
109+
### Approach 3: StringBuilder Array (Alternative)
110+
111+
Similar to Approach 1 but uses explicit numeric direction tracking.
112+
113+
- **Time Complexity:** O(n)
114+
- **Space Complexity:** O(n)
115+
116+
## Solution Results
117+
118+
| Approach | Time Complexity | Space Complexity | LeetCode Runtime | Memory |
119+
| --------------------------- | --------------- | ---------------- | ---------------- | ------- |
120+
| Row-by-Row Simulation | O(n) | O(n) | ~4ms | ~50 MB |
121+
| Mathematical Index | O(n) | O(n) | ~4ms | ~49 MB |
122+
| StringBuilder Array | O(n) | O(n) | ~5ms | ~50 MB |
123+
124+
## Complexity Analysis
125+
126+
### Why O(n) Time for All Approaches?
127+
128+
All three approaches process each character exactly once:
129+
130+
1. **Simulation:** One pass through the string, adding to rows
131+
2. **Mathematical:** One pass building the result by row, each char visited once
132+
3. **Alternative:** Same as simulation with different structure
133+
134+
### Why O(n) Space?
135+
136+
We need to store the result string which has the same length as the input. The row arrays or result builders collectively hold n characters.
137+
138+
## Key Insights
139+
140+
1. **Pattern Recognition:** The zigzag creates a predictable pattern with cycle length `2 * numRows - 2`
141+
142+
2. **Edge Cases Matter:**
143+
- `numRows = 1`: No zigzag occurs, return original string
144+
- `numRows >= s.length`: Each character on its own row, return original string
145+
146+
3. **Direction Toggle:** Direction changes exactly at row 0 and row `numRows - 1`
147+
148+
4. **Middle Rows Have Two Characters Per Cycle:** Unlike the first and last rows, middle rows receive characters from both the "going down" and "going up" phases
149+
150+
5. **Cycle Length Formula:** For `numRows` rows, one complete down-and-up cycle contains `2 * numRows - 2` characters
151+
152+
## Visual Understanding
153+
154+
For `"PAYPALISHIRING"` with `numRows = 4`:
155+
156+
```
157+
Step-by-step placement:
158+
159+
P → Row 0
160+
A → Row 1
161+
Y → Row 2
162+
P → Row 3 (change direction ↑)
163+
A → Row 2
164+
L → Row 1
165+
I → Row 0 (change direction ↓)
166+
S → Row 1
167+
H → Row 2
168+
I → Row 3 (change direction ↑)
169+
R → Row 2
170+
I → Row 1
171+
N → Row 0 (change direction ↓)
172+
G → Row 1
173+
174+
Final rows:
175+
Row 0: P I N
176+
Row 1: A L S I G
177+
Row 2: Y A H R
178+
Row 3: P I
179+
180+
Result: "PINALSIGYAHRPI"
181+
```
182+
183+
## Notes
184+
185+
- The mathematical approach is slightly more memory-efficient as it doesn't need temporary row storage
186+
- Both simulation approaches are more intuitive and easier to understand
187+
- All approaches handle the edge cases identically
188+
- String concatenation in JavaScript is optimized, so using `+=` is acceptable for this problem size
189+
190+
## Code Quality Checklist
191+
192+
- [x] Handles all edge cases (numRows = 1, numRows >= length)
193+
- [x] O(n) time complexity achieved
194+
- [x] O(n) space complexity (optimal for this problem)
195+
- [x] Clean, readable code with meaningful variable names
196+
- [x] Comprehensive test coverage
197+
- [x] Multiple solution approaches demonstrated

0 commit comments

Comments
 (0)