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

Kimi LeetCode 3518. 最小回文排列 II Python3实现

```python
class Solution:
MAX_K = 1_000_001

def smallestPalindrome(self, s: str, k: int) -> str:
n = len(s)
half = s[:n // 2]
mid = s[n // 2] if n % 2 == 1 else ""

cnt = [0] * 26
for c in half:
cnt[ord(c) - ord('a')] += 1

# 总排列数不足 k
if self.count_arrangements(cnt) < k:
return ""

half_len = len(half)
ans = []

for _ in range(half_len):
for i in range(26):
if cnt[i] == 0:
continue
# 尝试将字符 i 填入当前位
cnt[i] -= 1
ways = self.count_arrangements(cnt)
if k <= ways:
ans.append(chr(ord('a') + i))
break
else:
# 该分支不包含目标,恢复并跳过
cnt[i] += 1
k -= ways

left = "".join(ans)
return left + mid + left[::-1]

def count_arrangements(self, cnt: list[int]) -> int:
"""计算多重集排列数,超过 MAX_K 时截断"""
total = sum(cnt)
res = 1
for c in cnt:
if c == 0:
continue
res *= self.comb(total, c)
if res >= self.MAX_K:
return self.MAX_K
total -= c
return res

def comb(self, n: int, k: int) -> int:
"""组合数 C(n, k),超过 MAX_K 时截断"""
k = min(k, n - k)
res = 1
for i in range(1, k + 1):
res = res * (n - i + 1) // i
if res >= self.MAX_K:
return self.MAX_K
return res
```

核心思路

回文串由左半部分唯一确定(奇数长度时中间字符固定),因此问题转化为求左半部分字符串的第 k 小不同排列。

1. 多重集排列数:用组合数连乘 `C(n, v1) * C(n-v1, v2) * ...` 计算,避免阶乘溢出。由于 `k ≤ 10^6`,乘积超过 `1_000_001` 时直接截断。
2. 贪心构造:从左到右逐位确定,从小到大枚举 `'a'~'z'`,尝试将当前字符填入该位,计算剩余位置的排列数 `ways`。若 `k ≤ ways`,则确定该位;否则 `k -= ways` 并尝试下一个字符。
3. 复杂度:时间 `O(|half| * 26 * log(k))`,空间 `O(1)`。

http://www.jsqmd.com/news/1153812/

相关文章:

  • VMware安装CentOS避坑指南:从网络配置到性能优化的完整实践
  • 直流负载管理:G6D-ASI继电器与PIC18F55K42微控制器优化方案
  • 【Windows保姆级】Claude Code安装+API配置完整教程(亲测跑通)
  • CISP-PTE:网络攻防必考渗透证书详解
  • 只会生成意见,不算真正会审合同
  • WSL2 + Ubuntu 22.04:稳定高效的本地AI开发基线环境
  • 工业信号采集抗干扰设计与STM32F765ZI应用
  • 张正友标定法 vs OpenCV `calibrateCamera`:3个关键参数与精度对比
  • ZenlessZoneZero-OneDragon:绝区零全自动智能助手,解放双手的游戏效率神器
  • 从零构建智能体技能:解锁AI自动化工作流的核心实践
  • 2026 最新 Web 渗透保姆级路线,超详细阶段规划,零基础入门到就业一站式指南
  • 5分钟精通专业字体:Source Han Serif CN终极使用宝典
  • 标书客 | 一站式全流程投标服务:不止撰写标书,更做您的合规投标顾问
  • 如何让B站缓存视频告别碎片化?这款Android合并工具给你答案
  • clip模型及论文精读-Learning Transferable Visual Models From Natural Language Supervision
  • 自学系规VS跟金老师学:两种路径的对比分析
  • 2026汉中黄金回收白银回收铂金回收价格高无损耗专业鉴定本地人常去门店联系方式推荐
  • Paperxie AI 开题报告智能生成工具:三步标准化流程,一键产出贴合院校规范的开题文稿
  • 美的智能设备本地控制终极指南:5分钟实现Home Assistant集成
  • Hotkey Detective完整指南:3步高效定位Windows热键冲突的终极方案
  • 南京AI智能体培训机构靠谱吗 - 深度解析选择要点
  • 3步彻底解锁网易云音乐NCM格式:ncmdumpGUI让你的音乐真正自由
  • 基于物证逻辑的西方古典叙事辨伪与中华文明实证研究
  • 终极Mixamo动画转换方案:3分钟实现UE4骨骼重映射与根运动保留
  • Spring Boot 调用外部接口替代HttpClient | RestTemplate、WebClient、OpenFeign最佳实践
  • 简易个人博客系统测试报告
  • 伍德灯照出隐形尿渍用哪种除臭剂有效
  • 10分钟玩转QMK Toolbox:机械键盘固件刷写终极指南
  • 企业Agent从0到1:避开三大误区,用这五问精准定位高价值场景!
  • Godot 4模块化战斗原型:行为树AI与组件化架构实战