尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Kimi    LeetCode 3518. 最小回文排列 II Rust实现
📅 发布时间:2026/7/9 15:49:54

LeetCode 3518. 最小回文排列 II 的核心思路是:回文串由前半部分唯一确定(奇数长度时中间字符固定),因此问题转化为求前半部分字符串的第 k 小不同排列。

具体做法:
1. 提取前半部分 `half` 和中间字符 `mid`(若有)。
2. 用组合数连乘计算多重集排列数(避免阶乘溢出):`C(n, v1) * C(n-v1, v2) * ...`。由于 `k ≤ 10^6`,当乘积超过 `1_000_001` 时直接截断。
3. 若总排列数 `< k`,返回空串。
4. 逐位贪心构造:从小到大枚举 `'a'~'z'`,尝试将当前字符填入该位,计算剩余位置的排列数 `ways`。若 `k ≤ ways`,则确定该位;否则 `k -= ways` 并尝试下一个字符。
5. 最后将构造好的左半部分翻转拼接。

时间复杂度 `O(|half| * 26 * log(k))`,空间复杂度 `O(1)`。

```rust
impl Solution {
const MAX_K: i64 = 1_000_001;

pub fn smallest_palindrome(s: String, k: i32) -> String {
let mut k = k as i64;
let n = s.len();
let half = &s[..n / 2];
let mid = if n % 2 == 0 { "" } else { &s[n / 2..n / 2 + 1] };

let mut cnt = [0i32; 26];
for c in half.chars() {
cnt[(c as u8 - b'a') as usize] += 1;
}

// 总排列数不足 k
if Self::count_arrangements(&cnt) < k {
return String::new();
}

let half_len = half.len();
let mut ans = String::with_capacity(half_len);

for _ in 0..half_len {
for i in 0..26 {
if cnt[i] == 0 {
continue;
}
// 尝试填入字符 i
cnt[i] -= 1;
let ways = Self::count_arrangements(&cnt);
if k <= ways {
ans.push((b'a' + i as u8) as char);
break;
} else {
// 不在该分支,恢复并跳过
cnt[i] += 1;
k -= ways;
}
}
}

let rev: String = ans.chars().rev().collect();
ans + mid + &rev
}

/// 计算多重集排列数,超过 MAX_K 时截断
fn count_arrangements(cnt: &[i32; 26]) -> i64 {
let mut total = 0i32;
for &c in cnt.iter() {
total += c;
}
let mut res: i64 = 1;
for &c in cnt.iter() {
if c == 0 {
continue;
}
res *= Self::comb(total, c);
if res >= Self::MAX_K {
return Self::MAX_K;
}
total -= c;
}
res
}

/// 组合数 C(n, k),超过 MAX_K 时截断
fn comb(n: i32, k: i32) -> i64 {
let n = n as i64;
let k = k as i64;
let k = k.min(n - k);
let mut res: i64 = 1;
for i in 1..=k {
res = res * (n - i + 1) / i;
if res >= Self::MAX_K {
return Self::MAX_K;
}
}
res
}
}
```

关键点说明:
- `count_arrangements` 将多重集排列分解为依次选位置的组合数连乘,避免了先算大阶乘再除法的溢出问题。
- `comb` 利用 `C(n,k) = C(n,k-1) * (n-k+1) / k` 递推,并取 `k = min(k, n-k)` 减少循环次数,同时保证中间结果始终可被整除。
- 截断值 `MAX_K = 1_000_001` 略大于题目 `k` 的上限,既防溢出又不会影响正确判断。

相关新闻

  • 4D毫米波雷达点云生成实战:基于U-Net与GAN的CFAR替代方案,点云密度提升3倍
  • 终极免费Altium电路图查看器:无需专业软件解析SchDoc文件的完整指南
  • STM32 DS18B20温度采集优化:3种滤波算法对比与±0.1℃精度实现

最新新闻

  • 2026年沈阳腕表回收市场 禹竞高价收表广受好评 - 奢品小当家
  • PDF文件太大的几种压缩方法:从在线工具到Python脚本
  • 5分钟终极指南:一次性解决所有Windows C++运行库安装问题
  • OpenAI GPT-Live-1全双工语音模型:架构解耦、委派推理与AI语音交互的范式革命
  • 加密神器,流批了
  • 劳力士中国官方售后服务中心|官方地址及售后服务热线权威信息通知(2026年7月最新) - 劳力士服务中心

日新闻

  • SQL 查询语句的标准逻辑执行顺序(即语义处理顺序),它与实际书写顺序不同,但决定了数据库如何解析和执行查询
  • ORB-SLAM2 重定位模块深度解析:从 BoW 候选帧到 PnP 优化的 6 步流程
  • 罗技鼠标宏压枪脚本终极指南:从原理到实战的完整解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号