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;
    }
};
相关推荐
java_nnnn8 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
文丑颜不良啊11 小时前
LeetCode276~300题目解析
java·leetcode
傅科摆 _ py13 小时前
链表力扣复习
数据结构·leetcode·链表
圣保罗的大教堂16 小时前
leetcode 3863. 将一个字符串排序的最小操作次数 中等
leetcode
Tisfy16 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论
0+11116 小时前
算法 --递归
算法·leetcode
y1su18 小时前
Leetcode 链表,树,回溯 模板
java·leetcode·链表
文丑颜不良啊1 天前
LeetCode201~225题目解析
java·leetcode
Nil2081 天前
LeetCode 283移动零
数据结构·算法·leetcode
文丑颜不良啊1 天前
LeetCode226~250题目解析
java·leetcode