Largest Palindromic Number
Build the largest palindrome from given digits using greedy half-construction.
5 min read
greedy string
Problem#
Given a string of digits, return the largest palindrome you can build using any subset (no leading zeros unless the whole result is “0”).
Examples#
"444947137"→"7449447""00009"→"9"
Constraints#
1 <= n <= 10^5.
Hints#
Hint 1
Count each digit. For each pair, append
digit to a “half” string. Pick the largest unused digit as the optional middle character. Approach#
Count digits 0–9. Build the left half: walk digits 9..0; while count ≥ 2, append a digit and consume 2. Pick the optional middle: largest digit with remaining count > 0. Watch for the all-zero leading-zero case.
Solution#
class Solution {public: string largestPalindromic(string num) { int cnt[10] = {0}; for (char c : num) ++cnt[c - '0']; string half; for (int d = 9; d >= 0; --d) { while (cnt[d] >= 2) { if (half.empty() && d == 0) break; // avoid leading zeros half += '0' + d; cnt[d] -= 2; } if (half.empty() && d == 0) break; } int mid = -1; for (int d = 9; d >= 0; --d) if (cnt[d] > 0) { mid = d; break; } string ans = half; if (mid >= 0) ans += '0' + mid; ans += string(half.rbegin(), half.rend()); return ans.empty() ? "0" : ans; }};func largestPalindromic(num string) string { cnt := [10]int{} for _, c := range num { cnt[c-'0']++ } half := []byte{} for d := 9; d >= 0; d-- { for cnt[d] >= 2 { if len(half) == 0 && d == 0 { break } half = append(half, byte('0'+d)) cnt[d] -= 2 } if len(half) == 0 && d == 0 { break } } mid := -1 for d := 9; d >= 0; d-- { if cnt[d] > 0 { mid = d break } } ans := append([]byte{}, half...) if mid >= 0 { ans = append(ans, byte('0'+mid)) } for i := len(half) - 1; i >= 0; i-- { ans = append(ans, half[i]) } if len(ans) == 0 { return "0" } return string(ans)}class Solution: def largestPalindromic(self, num: str) -> str: cnt = [0] * 10 for c in num: cnt[int(c)] += 1 half = [] for d in range(9, -1, -1): while cnt[d] >= 2: if not half and d == 0: break half.append(str(d)) cnt[d] -= 2 if not half and d == 0: break mid = -1 for d in range(9, -1, -1): if cnt[d] > 0: mid = d break ans = ''.join(half) if mid >= 0: ans += str(mid) ans += ''.join(reversed(half)) return ans if ans else "0"function largestPalindromic(num) { const cnt = new Array(10).fill(0); for (const c of num) cnt[c.charCodeAt(0) - 48]++; let half = ''; for (let d = 9; d >= 0; d--) { while (cnt[d] >= 2) { if (half.length === 0 && d === 0) break; half += String(d); cnt[d] -= 2; } if (half.length === 0 && d === 0) break; } let mid = -1; for (let d = 9; d >= 0; d--) { if (cnt[d] > 0) { mid = d; break; } } let ans = half; if (mid >= 0) ans += String(mid); ans += half.split('').reverse().join(''); return ans === '' ? '0' : ans;}class Solution { public String largestPalindromic(String num) { int[] cnt = new int[10]; for (int i = 0; i < num.length(); i++) cnt[num.charAt(i) - '0']++; StringBuilder half = new StringBuilder(); for (int d = 9; d >= 0; d--) { while (cnt[d] >= 2) { if (half.length() == 0 && d == 0) break; half.append((char) ('0' + d)); cnt[d] -= 2; } if (half.length() == 0 && d == 0) break; } int mid = -1; for (int d = 9; d >= 0; d--) { if (cnt[d] > 0) { mid = d; break; } } StringBuilder ans = new StringBuilder(half); if (mid >= 0) ans.append((char) ('0' + mid)); ans.append(half.reverse()); return ans.length() == 0 ? "0" : ans.toString(); }}function largestPalindromic(num: string): string { const cnt: number[] = new Array(10).fill(0); for (const c of num) cnt[c.charCodeAt(0) - 48]++; let half = ''; for (let d = 9; d >= 0; d--) { while (cnt[d] >= 2) { if (half.length === 0 && d === 0) break; half += String(d); cnt[d] -= 2; } if (half.length === 0 && d === 0) break; } let mid = -1; for (let d = 9; d >= 0; d--) { if (cnt[d] > 0) { mid = d; break; } } let ans = half; if (mid >= 0) ans += String(mid); ans += half.split('').reverse().join(''); return ans === '' ? '0' : ans;}Editorial#
A palindrome’s left half determines its order. Greedy: at each digit slot, take the largest available pair. The leading-zero rule prevents 00...x...00 outputs. The middle character is the largest single digit remaining after all pairs are placed.
Complexity#
- Time: O(n).
- Space: O(1).
Concept revision#
Related#