leetcode 3517. 最小回文排列 I 中等

给你一个 回文 字符串 s

返回 s 的按字典序排列的 最小回文排列。

如果一个字符串从前往后和从后往前读都相同,那么这个字符串是一个 回文字符串。

排列是字符串中所有字符的重排。

如果字符串 a 按字典序小于字符串 b,则表示在第一个不同的位置,a 中的字符比 b 中的对应字符在字母表中更靠前。

如果在前 min(a.length, b.length) 个字符中没有区别,则较短的字符串按字典序更小。

示例 1:

输入: s = "z"

输出: "z"

解释:

仅由一个字符组成的字符串已经是按字典序最小的回文。

示例 2:

输入: s = "babab"

输出: "abbba"

解释:

通过重排 "babab""abbba",可以得到按字典序最小的回文。

示例 3:

输入: s = "daccad"

输出: "acddca"

解释:

通过重排 "daccad""acddca",可以得到按字典序最小的回文。

提示:

  • 1 <= s.length <= 10^5
  • s 由小写英文字母组成。
  • 保证 s 是回文字符串。

分析:由于 s 一定是回文字符串,则 s 中出现的字符,一定最多只有一个字符出现次数为奇数,其它所有字符出现次数都是偶数。因此可以遍历 s 字符串,统计所有字符的出现次数,再从字典序由小到大遍历所有字符,按照对称方式从小到大填充字符串。若某个字符出现次数为奇数,则在字符串的中间位置填上该字符。直到把字符串填满。

cpp 复制代码
class Solution {
public:
    string smallestPalindrome(string s) {
        int n=s.length(),cnt[30]={0};
        string ret=s;
        for(int i=0;i<n;++i)
            cnt[s[i]-'a']++;
        for(int i=0,t=0;i<26;++i)
        {
            if(!cnt[i])continue;

            if(cnt[i]&1)cnt[i]--,ret[n/2]=i+'a';
            while(cnt[i]>0)
                ret[t]=ret[n-t-1]=i+'a',cnt[i]-=2,t++;
        }
        return ret;
    }
};
相关推荐
alphaTao4 小时前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
Hi李耶10 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展
海绵天哥14 小时前
LeetCode Hot 100 | 链表(下)· 分组翻转与设计(C++ 题解)
c++·leetcode·链表
tkevinjd1 天前
力扣131-分割回文串
算法·leetcode·深度优先
zander2581 天前
LeetCode 78. 子集
算法·leetcode·深度优先
Tisfy1 天前
LeetCode 3014.输入单词需要的最少按键次数 I:遍历 / if-else计算(比纯数学公式写起来麻烦但好想)
数学·算法·leetcode·字符串·题解·贪心
tkevinjd1 天前
力扣239-滑动窗口最大值
算法·leetcode·职场和发展
圣保罗的大教堂1 天前
leetcode 628. 三个数的最大乘积 简单
leetcode
良木林1 天前
矩阵 - LeetCode hot 100
线性代数·算法·leetcode·矩阵