当前位置: 首页 > news >正文

A.每日一题:3517. 最小回文排列 I

题目链接:3517. 最小回文排列 I(中等)

算法原理:

解法一:计数排序

时间复杂度O(N)

写法一:StringBuffer

79ms击败5.76%

1.思路很简单,利用计数排序的思想,既然字符串给的是回文的,那么我们只需要统计前一半就行了,统计前一半中26个小写英文字符出现的次数,然后从 a 遍历到 z 依次拼接即可

2.拼接之后,后半部分就直接翻转过来再接上,这一点用 StringBuffer 可以很简单的实现

3.最后一点就是看这个回文串长度是奇数还是偶数,我们上述做法得到的回文串必定是偶数的,如果是奇数的话差的一定是中间的那个,而中间的那个在最终结果的位置必然还是在中间,否则这个字符串必然不再是回文,因此我们直接把原字符串的正中间的字符取出来接在中间即可

4.最后根据原字符串的奇偶长度返回不同的结果即可

写法二:StringBuilder

33ms击败54.86%

思路与写法一完全相同,但这个会更快,因为 StringBuffer 是线程安全的,中间加了很多锁,而 StringBuffer 是线程不安全的,没有那么多锁,效率要比 StringBuffer 快不少

关于线程中上锁的知识可参考👇

Java EE:2.多线程-初阶(第四弹):synchronized 锁+内存可见性

Java EE:3.多线程-进阶(第一弹):常见的锁策略+synchronized原理

优化

16ms击败98.96%

中间重复添加相同字符的部分可以借助 repeat 实现

String a = "a"; String fiveAs = a.repeat(5); // 结果就是 "aaaaa"

解法二:排序左半部分

48ms击败15.03%

时间复杂度O(n logn)

由于 s 是回文字符串,我们只需关心左半部分如何排列即可,因此我们可以将左半部分拿出来排列后在用 StringBuilder 拼接上去,后半部分只需要逆序拼接即可

Java代码:

class Solution { //3517. 最小回文排列 I //解法一:计数排序-写法一:StringBuffer public String smallestPalindrome(String s) { if(s.length()==1) return s; int[] hash=new int[26]; StringBuffer cur=new StringBuffer(); for(int i=0;i<s.length()/2;i++) hash[s.charAt(i)-'a']++; for(int i=0;i<26;i++) while(hash[i]-->0) cur.append((char)(i+'a')); if(s.length()%2==0) return cur.toString()+cur.reverse().toString(); else return cur.toString()+s.charAt(s.length()/2)+cur.reverse().toString(); } }
class Solution { //3517. 最小回文排列 I //解法一:计数排序-写法二:StringBuilder public String smallestPalindrome(String s) { if(s.length()==1) return s; int[] hash=new int[26]; StringBuilder cur=new StringBuilder(); for(int i=0;i<s.length()/2;i++) hash[s.charAt(i)-'a']++; for(int i=0;i<26;i++) while(hash[i]-->0) cur.append((char)(i+'a')); if(s.length()%2==0) return cur.toString()+cur.reverse().toString(); else return cur.toString()+s.charAt(s.length()/2)+cur.reverse().toString(); } }
class Solution { //3517. 最小回文排列 I //解法一:计数排序-优化 public String smallestPalindrome(String s) { int n=s.length(); if(n==1) return s; int[] hash=new int[26]; StringBuilder cur=new StringBuilder(); for(int i=0;i<n/2;i++) hash[s.charAt(i)-'a']++; for(int i=0;i<26;i++) cur.repeat('a'+i,hash[i]); //提前拷贝一份 StringBuilder t=new StringBuilder(cur); //回文串长度为奇数就把中间的加上 if(n%2==1) cur.append(s.charAt(n/2)); cur.append(t.reverse()); return cur.toString(); } }
class Solution { //3517. 最小回文排列 I //解法二:排序左半部分 public String smallestPalindrome(String s) { int n=s.length(); int m=n/2; char[] t=s.substring(0,m).toCharArray(); Arrays.sort(t); StringBuilder cur=new StringBuilder(); cur.append(t); //判断是否是奇数长度回文串 if(n%2==1) cur.append(s.charAt(m)); //逆序拼接 for(int i=m-1;i>=0;i--) cur.append(t[i]); return cur.toString(); } }
http://www.jsqmd.com/news/1300477/

相关文章:

  • 多层板偶发开路、BGA 焊点空洞失效?详解无损透视检测
  • 基于声音信号的带式输送机托辊故障检测技术
  • STM32芯片加密与Flash保护实战:从RDP到UID加密的立体安全方案
  • 构建电子竞赛动态知识库:从信息孤岛到实战赋能
  • 终极免费方案:3分钟解锁Microsoft 365完整功能完全指南
  • AI Agent Skills:让智能客服像资深员工一样思考
  • 2026年安卓录音总结APP测评技术升级让录音整理更清晰更省心省力
  • STM32F103C8T6 DMA配置全解析:从原理到实战应用
  • 2026深圳医院设备搬运专业推荐:合规服务商盘点、避坑指南及不同等级医院适配全攻略 - 深圳家顺兴搬家
  • AI 智能灯泡智能功率 覆盖主驱动、调光控制、电源管理的完整选型方案
  • Meshroom完全指南:免费开源3D重建工具从零到精通
  • 【LH-调试问题点】
  • 小型单机 PLC 控制柜 VS 大型多柜联动产线系统设计差异(架构、IO、总线、安全)
  • Java反序列化漏洞实战:从CC链原理到CTFshow靶场利用
  • 如何高效修复损坏视频:Untrunc完整部署与实战指南
  • Docker Swarm Keepalived Operator:高可用集群虚拟 IP 管理方案
  • 多模态情感识别数据集
  • React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
  • oracle,安装oracle时,最后提示: 监听程序未启动或数据库服务未注册到该监听程序,如何解决
  • CodeCombat终极指南:5步开启免费游戏化编程学习之旅
  • 2026装修行业怎么做GEO推广?把握AI搜索趋势 解锁精准获客新通路
  • 高端瓜子品牌优选 洽洽全链品质铸就高端口碑 - 盈达新发现
  • 《聪明的投资者》系列②:什么是安全边际?为什么它至今仍是价值投资的核心原则?
  • 易货商城小程序系统(现成案例)
  • 蒸馏战争——当最好用的编程工具变成最危险的污染源
  • 抖音小店未来运营趋势分析!自动化发货是否会全面取代传统人工手动操作 - 抖掌柜
  • Agent 能完成一个任务,但它能持续追一个三个月的目标吗?
  • 分子与蛋白互作伯远生物分子与蛋白互作
  • 从Java开发到大模型工程师:零基础转型实战指南
  • Python字符串查找:find()方法原理、应用与性能优化全解析