Description
You are given a palindromic string s.
Return the lexicographically smallest palindromic permutation of s.
Β
Example 1:
Input: s = "z"
Output: "z"
Explanation:
A string of only one character is already the lexicographically smallest palindrome.
Example 2:
Input: s = "babab"
Output: "abbba"
Explanation:
Rearranging "babab" β "abbba" gives the smallest lexicographic palindrome.
Example 3:
Input: s = "daccad"
Output: "acddca"
Explanation:
Rearranging "daccad" β "acddca" gives the smallest lexicographic palindrome.
Β
Constraints:
- 1 <= s.length <= 105
- sconsists of lowercase English letters.
- sis guaranteed to be palindromic.
Solution
Python3
class Solution:
    def smallestPalindrome(self, s: str) -> str:
        N = len(s)
        counter = [0] * 26
        res = [""] * N
 
        for x in s:
            counter[ord(x) - ord('a')] += 1
 
        i, j = 0, N - 1
        odd = None
        cIndex = 0
        while i <= j and cIndex < 26:
            if counter[cIndex] == 0: 
                cIndex += 1
                continue
 
            while i < j and counter[cIndex] >= 2:
                res[i] = res[j] = chr(ord('a') + cIndex)
                i += 1
                j -= 1
                counter[cIndex] -= 2
 
            if counter[cIndex] == 1:
                odd = cIndex
                cIndex += 1
 
            if i == j and odd is not None:
                res[i] = chr(ord('a') + odd)
                break
 
        return "".join(res)