medium Largest Palindromic Number
Problem Statement
Given a string s containing 0 to 9 digits, create the largest possible palindromic number using the string characters. It should not contain leading zeroes.
A palindromic number reads the same backward as forward.
If it's not possible to form such a number using all digits of the given string, you can skip some of them.
Examples
Example 1
- Input: s = "323211444"
- Expected Output: "432141234"
- Justification: This is the largest palindromic number that can be formed from the given digits.
Example 2
- Input: s = "998877"
- Expected Output: "987789"
- Justification: "987789" is the largest palindrome that can be formed.
Example 3
- Input: s = "54321"
- Expected Output: "5"
- Justification: Only "5" can form a valid palindromic number as other digits cannot be paired.
Constraints:
- 1 <= num.length <= 105
numconsists of digits.
Try it yourself
Try solving this question here:
✅ Solution Largest Palindromic Number
Problem Statement
Given a string s containing 0 to 9 digits, create the largest possible palindromic number using the string characters. It should not contain leading zeroes.
A palindromic number reads the same backward as forward.
If it's not possible to form such a number using all digits of the given string, you can skip some of them.
Examples
Example 1
- Input: s = "323211444"
- Expected Output: "432141234"
- Justification: This is the largest palindromic number that can be formed from the given digits.
Example 2
- Input: s = "998877"
- Expected Output: "987789"
- Justification: "987789" is the largest palindrome that can be formed.
Example 3
- Input: s = "54321"
- Expected Output: "5"
- Justification: Only "5" can form a valid palindromic number as other digits cannot be paired.
Constraints:
- 1 <= num.length <= 105
numconsists of digits.
Solution
To solve this problem, the goal is to create the largest palindromic number possible using the digits from the given input number. A palindrome reads the same backward as forward, so our approach is to build the number symmetrically.
First, we count the frequency of each digit in the input number using an array of size 10 (for digits 0-9). Then, we construct the first half of the palindrome by appending each digit as many times as half of its frequency, starting from the highest digit (9) down to the lowest (0). If there is a digit with an odd frequency, we select the largest such digit to be the center of the palindrome. Finally, we append the reversed first half to the original first half (with the center digit, if any) to complete the palindrome. This ensures that the number is the largest possible palindrome.
Step-by-Step Algorithm
-
Initialize Data Structures:
- Create a
StringBuildernamedfirstHalfto store the first half of the palindrome. - Create an integer array
frequencyof size 10 to count the frequency of each digit (0-9). - Initialize a variable
middleto -1 to store the center digit if needed.
- Create a
-
Count Frequencies:
- Iterate through each character in the input string
num. - For each character, convert it to an integer and increment its corresponding frequency in the
frequencyarray.
- Iterate through each character in the input string
-
Build the First Half of the Palindrome:
- Iterate from the highest digit (9) to the lowest digit (0).
- For each digit, if its frequency is greater than 1:
- Use while loop to add pairs of the digit to
firstHalfuntil less than 2 of that digit remains. - If there is one of the digit left and
middleis still -1, setmiddleto this digit (largest odd-count digit).
- Use while loop to add pairs of the digit to
-
Build the Full Palindrome:
- Create
secondHalfas a reversed copy offirstHalf. - If
middleis not -1, appendmiddletofirstHalf. - Append the reversed
secondHalftofirstHalf.
- Create
-
Return the Result:
- If
firstHalfhas any digits, returnfirstHalfas the final palindrome. - Otherwise, return "0".
- If
Algorithm Walkthrough
-
Initialize Data Structures:
firstHalf = ""frequency = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]center = -1
-
Count Frequencies:
- Process each digit in
num:3:frequency[3]becomes 1.2:frequency[2]becomes 1.3:frequency[3]becomes 2.2:frequency[2]becomes 2.1:frequency[1]becomes 1.1:frequency[1]becomes 2.4:frequency[4]becomes 1.4:frequency[4]becomes 2.4:frequency[4]becomes 3.
- Final
frequency = [0, 2, 2, 2, 3, 0, 0, 0, 0, 0]
- Process each digit in
-
Build the First Half of the Palindrome:
- Iterate from digit 9 to 0:
9:frequency[9]is 0, skip.8:frequency[8]is 0, skip.7:frequency[7]is 0, skip.6:frequency[6]is 0, skip.5:frequency[5]is 0, skip.4:frequency[4]is 3:- Append "4" to
firstHalf,firstHalf = "4",countbecomes 1. centeris set to4since it's the largest digit with an odd frequency.
- Append "4" to
3:frequency[3]is 2:- Append "3" to
firstHalf,firstHalf = "43",countbecomes 0.
- Append "3" to
2:frequency[2]is 2:- Append "2" to
firstHalf,firstHalf = "432",countbecomes 0.
- Append "2" to
1:frequency[1]is 2:- Append "1" to
firstHalf,firstHalf = "4321",countbecomes 0.
- Append "1" to
0:frequency[0]is 0, skip.
- Final
firstHalf = "4321"
- Iterate from digit 9 to 0:
-
Build the Full Palindrome:
- Create
secondHalfas a reversed copy offirstHalf,secondHalf = "1234". centeris4, so add4tofirstHalf, making it43214.- Append
secondHalftofirstHalf,firstHalf = "432144321".
- Create
-
Return the Result:
firstHalfhas digits, so returnfirstHalf.toString(), which is"432144321".
So, the largest palindromic number that can be formed from "323211444" is "432144321".
Code
Here is the code for this algorithm:
import java.util.Arrays; // Import Arrays class
public class Solution {
public String largestPalindromic(String s) {
StringBuilder firstHalf = new StringBuilder(); // StringBuilder to store first half of the palindrome
int[] frequency = new int[10]; // Frequency array for digits 0-9
// Count the frequency of each digit in the input number
for (int i = 0; i < s.length(); i++) {
int val = (s.charAt(i) - '0');
frequency[val] += 1;
}
int middle = -1; // Variable to store the middle digit if needed
// Iterate from the highest digit (9) to the lowest (0)
for (int i = 9; i >= 0; i--) {
if (frequency[i] != 0 && (i != 0 || firstHalf.length() > 0)) {
int count = frequency[i];
while (count > 1) {
firstHalf.append(i); // Append the digit to firstHalf
count -= 2; // Use two of the digit for the first half
}
if (count == 1 && middle == -1) {
middle = i; // Assign the middle digit if it's the largest odd-count digit
}
}
}
StringBuilder secondHalf = new StringBuilder(firstHalf); // Create secondHalf as a reversed copy of firstHalf
if (middle != -1) firstHalf.append(middle); // Append the middle digit if it exists
firstHalf.append(secondHalf.reverse()); // Append the reversed first half to firstHalf
return firstHalf.length() > 0 ? firstHalf.toString() : "0"; // Return the final palindrome or "0"
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.largestPalindromic("323211444")); // 432141234
System.out.println(solution.largestPalindromic("998877")); // 987789
System.out.println(solution.largestPalindromic("54321")); // 5
}
}
Complexity Analysis
-
Time Complexity:
, where n is the length of the input string. The algorithm involves iterating over the input string once for frequency counting and then iterating over the frequency array (constant size of 10). -
Space Complexity: Space Complexity:
, where (n) is the length of the input string. - Frequency Array:
space. - First Half StringBuilder: Up to
space in the worst case. - Middle String:
space.
- Frequency Array:
🤖 Don't fully get this? Learn it with Claude
Stuck on Largest Palindromic Number? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Largest Palindromic Number** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Largest Palindromic Number** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Largest Palindromic Number**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Largest Palindromic Number**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.