Decreasing and increasing alphabet rows keep a fixed width: each row starts with a growing descending prefix, then fills the rest with a shrinking ascending suffix from A.
As the left side grows (B, CB, DCB, …), the right side shrinks (ABCD, ABC, AB, A) so every line stays the same length. Compare with Program 24 (palindrome triangles) and Program 29 (layered diamond).
Approach
How to Solve It
Two ways to emit the same grid — inline two loops per row, or factor a print_row helper.
Method
Idea
Best for
Two loops inline
Descending $i..1, then ascending 0..($n−$i)
Learning, interviews, exams
print_row helper
One function owns both parts; outer loop only picks $i
Cleaner demos once the width budget clicks
Pseudocode
Pseudocode
$n = ord($end) - ord('A')
for $i from 0 to $n:
for $j from $i down to 1: echo $alpha[$j]
for $k from 0 to $n - $i: echo $alpha[$k]
echo PHP_EOL
1. print_row owns both parts. Prefix and suffix live in one place.
2. Thin outer loop. The script only decides which row index $i to print.
Edge Cases & Pitfalls
Check these before calling the solution done.
j >= 0
Duplicate A at the join
If the prefix includes index 0, you get …AA…. Keep for ($j = $i; $j > 0; $j--).
Wrong suffix end
Uneven row widths
Suffix must stop at $n − $i. Ending at a fixed $n makes later rows too long.
PHP_EOL inside
Column of letters
If echo PHP_EOL is inside either loop, each letter lands on its own line. Use echo for letters; end the row only after both parts.
end = A
Single A
When $n = 0, you print one row: A. A good sanity check.
i = 0
Empty prefix is normal
The first row prints only the ascending suffix A..end — that is expected, not a bug.
Bad input
Validate one letter
Trim, uppercase, and require length 1 in A–Z — reject empty or multi-character tokens.
Analysis
Time and Space Complexity
Program
Time
Extra space
Two loops inline (Examples 1–2)
O(n²)
O(1) (plus the fixed alphabet table)
Helper function (Example 3)
O(n²)
O(1)
For letters A..end there are $n + 1 rows, each of width $n + 1 — quadratic in n.
Remember
Key Takeaways
Rule: prefix $i..1 + suffix 0..($n − $i).
Width budget: prefix grows as suffix shrinks — total always $n + 1.
Break the row: call echo PHP_EOL only after both loops.
Complexity:O(n²) time; O(1) extra space.
One line: for each $i, print $i down to B, then A up through index $n − $i.
Frequently Asked Questions
A is printed in the second loop. If the first loop included A, the join would duplicate A.
To keep each row the same width, end the ascending part at indices 0..(n − i). For A..E that is A + E − i, so both parts always add up to n+1 letters.
Yes. Set $n = ord($end) − ord('A') and keep the same loops: descending $j from $i down to 1, then ascending $k from 0 to $n − $i.
O(n²) for n letters because there are n rows and each row prints O(n) characters.
The descending prefix has length i and the ascending suffix has length (n − i + 1). Together they always equal n + 1.
echo stays on the same line. echo PHP_EOL ends the current line. Letters use echo; the row break uses echo PHP_EOL after both loops.
Program 24 builds palindrome triangles around A. This page keeps fixed-width rows by trading a growing descending prefix against a shrinking ascending suffix.
The descending loop does nothing, so you print only the ascending suffix A..end — for E that is ABCDE.
🤔
Did you know?
For each row i (A..E), print a descending prefix from i down to B (skip A), then print an ascending suffix from A up to A + E - i. That cap keeps row width constant at E - A + 1.