Welcome to Subscribe On Youtube
3517. Smallest Palindromic Rearrangement I
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 <= 105sconsists of lowercase English letters.sis guaranteed to be palindromic.
Solutions
Solution 1
-
class Solution { public String smallestPalindrome(String s) { int[] cnt = new int[26]; for (char c : s.toCharArray()) { cnt[c - 'a']++; } StringBuilder t = new StringBuilder(); String ch = ""; for (char c = 'a'; c <= 'z'; c++) { int idx = c - 'a'; int v = cnt[idx] / 2; if (v > 0) { t.append(String.valueOf(c).repeat(v)); } cnt[idx] -= v * 2; if (cnt[idx] == 1) { ch = String.valueOf(c); } } String ans = t.toString(); ans = ans + ch + new StringBuilder(ans).reverse(); return ans; } } -
class Solution { public: string smallestPalindrome(string s) { vector<int> cnt(26); for (char c : s) { cnt[c - 'a']++; } string t = ""; string ch = ""; for (char c = 'a'; c <= 'z'; ++c) { int v = cnt[c - 'a'] / 2; if (v > 0) { t.append(v, c); } cnt[c - 'a'] -= v * 2; if (cnt[c - 'a'] == 1) { ch = string(1, c); } } string ans = t; ans += ch; string rev = t; reverse(rev.begin(), rev.end()); ans += rev; return ans; } }; -
class Solution: def smallestPalindrome(self, s: str) -> str: cnt = Counter(s) t = [] ch = "" for c in ascii_lowercase: v = cnt[c] // 2 t.append(c * v) cnt[c] -= v * 2 if cnt[c] == 1: ch = c ans = "".join(t) ans = ans + ch + ans[::-1] return ans -
func smallestPalindrome(s string) string { cnt := make([]int, 26) for i := 0; i < len(s); i++ { cnt[s[i]-'a']++ } t := make([]byte, 0, len(s)/2) var ch byte for c := byte('a'); c <= 'z'; c++ { v := cnt[c-'a'] / 2 for i := 0; i < v; i++ { t = append(t, c) } cnt[c-'a'] -= v * 2 if cnt[c-'a'] == 1 { ch = c } } totalLen := len(t) * 2 if ch != 0 { totalLen++ } var sb strings.Builder sb.Grow(totalLen) sb.Write(t) if ch != 0 { sb.WriteByte(ch) } for i := len(t) - 1; i >= 0; i-- { sb.WriteByte(t[i]) } return sb.String() } -
function smallestPalindrome(s: string): string { const ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'; const cnt = new Array<number>(26).fill(0); for (const chKey of s) { cnt[chKey.charCodeAt(0) - 97]++; } const t: string[] = []; let ch = ''; for (let i = 0; i < 26; i++) { const c = ascii_lowercase[i]; const v = Math.floor(cnt[i] / 2); t.push(c.repeat(v)); cnt[i] -= v * 2; if (cnt[i] === 1) { ch = c; } } let ans = t.join(''); ans = ans + ch + ans.split('').reverse().join(''); return ans; }