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

DeepSeek LeetCode 3985. 回文子数组求和 Rust实现

题目简述

3985. 回文子数组求和:给定一个整数数组 nums,找出所有回文子数组中元素和的最大值。回文子数组是指正读反读相同的连续子数组。

约束:n ≤ 10⁵,nums[i] ≥ 1。朴素 O(n²) 的中心扩展会超时,需要用 Manacher 算法 在 O(n) 时间内求出所有回文半径。

---

Rust 实现

```rust
impl Solution {
pub fn get_sum(nums: Vec<i32>) -> i64 {
let n = nums.len();
if n == 0 {
return 0;
}

// 1. 前缀和,方便 O(1) 求子数组和
let mut pref = vec![0i64; n + 1];
for i in 0..n {
pref[i + 1] = pref[i] + nums[i] as i64;
}

// 2. 构造变换数组:用 -1 作为分隔符(nums[i] >= 1)
let mut t = Vec::with_capacity(2 * n + 1);
for i in 0..n {
t.push(-1);
t.push(nums[i]);
}
t.push(-1);

// 3. Manacher 算法计算每个中心的回文半径
let m = t.len();
let mut rad = vec![0; m];
let (mut center, mut right) = (0, 0);

for i in 0..m {
let mirror = 2 * center - i;
if i < right {
rad[i] = rad[mirror].min(right - i);
}

let (mut l, mut r) = (i as isize - rad[i] as isize - 1, i + rad[i] + 1);
while l >= 0 && r < m && t[l as usize] == t[r] {
rad[i] += 1;
l -= 1;
r += 1;
}

if i + rad[i] > right {
center = i;
right = i + rad[i];
}
}

// 4. 遍历所有中心,计算回文子数组在原数组中的范围和
let mut ans = 0i64;

for i in 0..m {
let r = rad[i];
if r == 0 {
continue;
}

let mut l = i as isize - r as isize;
let mut rr = i as isize + r as isize;

// 如果边界在分隔符(偶数索引)上,向内收缩一格去掉分隔符
if l % 2 == 0 {
l += 1;
rr -= 1;
}

if l > rr {
continue;
}

// 映射回原数组索引
let orig_l = (l / 2) as usize;
let orig_r = (rr / 2) as usize;

let sum = pref[orig_r + 1] - pref[orig_l];
if sum > ans {
ans = sum;
}
}

ans
}
}
```

---

核心思路

步骤 说明
前缀和 pref[i] 表示前 i 个元素的和,子数组 [l, r] 的和 = pref[r+1] - pref[l]
变换数组 在元素间插入不会与元素冲突的分隔符(-1),使奇偶长度的回文统一处理
Manacher 线性计算每个中心的最大回文半径 rad[i]
映射回原数组 将变换数组中的回文区间映射回原数组索引,用前缀和 O(1) 求值

复杂度:时间 O(n),空间 O(n),可处理 n ≤ 10⁵ 的数据规模。

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

相关文章:

  • Excel-Agent:AI智能体如何革新Excel数据处理
  • 终极指南:如何用QtScrcpy实现Android设备桌面级控制
  • 2026年全国厨房用纸批发供应商哪家好?综合实力解析与选型参考 - 汇聚至此
  • Windows 10终极指南:三步快速部署Android子系统完整教程
  • 薄膜压力传感器选型与应用全解析:从核心原理到工程实践
  • 亚克力摆件哪几种值得摆上桌面,我按实用度说几句真话 - 美杰亚克力
  • 麒麟系统安装Python3全攻略:从源码编译到虚拟环境配置
  • 高阶工程师(Staff Engineer)到底做什么?
  • 2026做小程序的公司有哪些?主流开发企业与技术平台盘点
  • Python Turtle库入门:从绘图到交互式编程的完整指南
  • Tkinter Designer:从可视化设计到现代化GUI开发的完整实践
  • Linux磁盘管理与存储技术实战笔记
  • 武汉榕霖职业技术学校 2026 招生报名入口 招生办咨询联系方式 - 武汉中职最新信息发布
  • 研究生暑假别瞎忙,做好这两件事情
  • AI写作黄金时代崩塌:模型变强文章却变烂,模仿受限写作流水线说塌就塌
  • 2026下半年国际会议安排汇总,涵盖智能计算、具身智能、机器人、信息系统、通信技术等热门研究方向,欢迎关注
  • 我的电视:让老旧智能设备焕发新生的Android电视直播终极解决方案
  • 从米哈游到Anuttacon,蔡浩宇的AI创业之路能否复制昔日辉煌?
  • 2026沈阳下水道疏通维修靠谱机构榜单 马桶地漏积水反臭倒灌彻底解决攻略 - 宅安选房屋修缮
  • 数据结构核心:二叉树原理、遍历与存储实战详解
  • 大学生学C语言,到底会遇到哪些作业?(新手全覆盖汇总)
  • 2026年工业照明信号灯厂家实力解析:台湾天得三色灯与警示指示灯优选品牌洞察 - 卓企推荐
  • Java高并发系统设计实录,程序员进阶必刷!
  • RANSAC算法:从原理到实战,解决离群点干扰的鲁棒模型拟合
  • 硬件设计实战:从电源到接口,四大外围电路设计要点与PCB避坑指南
  • AI时代程序员还需要深究源码吗?
  • FlowUs CLI 工具实战:AI 助手集成与命令行自动化操作指南
  • Unity集成Qwen3-TTS实现实时口型动画:从音素对齐到动画驱动全解析
  • DeepSeek LeetCode 3989. 网格中保持一致的最大列数 Java实现
  • Rust并发编程中的所有权挑战与解决方案:从实际项目看Clone策略的应用