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

DeepSeek 深度思考 LeetCode 3337. 字符串转换后的长度 II Rust实现

问题描述

给定一个由小写英文字母组成的字符串 s、一个整数 t(转换次数)以及一个长度为 26 的数组 nums。每次转换时,字符串中的每个字符 s[i] 都会替换为字母表中它后面连续的 nums[s[i] - 'a'] 个字符,如果超出 'z' 则回绕到字母表开头。

例如,'a' 且 nums[0] = 3,则 'a' 转换为 "bcd";'y' 且 nums[24] = 3,则 'y' 转换为 "zab"。要求返回恰好执行 t 次转换后字符串的长度,结果对 10^9 + 7 取模。

算法思路

核心思想:使用矩阵快速幂优化转换过程。

1. 状态表示:用一个长度为 26 的向量 count 表示当前每种字符的出现次数。
2. 构建转移矩阵:构建一个 26 x 26 的矩阵 M,其中 M[i][j] = 1 表示字符 i 经过一次转换会产生一个字符 j。
3. 计算转移矩阵的 t 次幂:利用快速幂计算 M^t。
4. 计算最终状态:将初始计数向量与 M^t 相乘,得到最终每种字符的计数。
5. 求和:将最终计数向量的所有元素相加,得到最终字符串长度。

Rust 实现

```rust
const MOD: i64 = 1_000_000_007;
const SIZE: usize = 26;

impl Solution {
pub fn length_after_transformations(s: String, t: i32, nums: Vec<i32>) -> i32 {
let t = t as usize;

// 1. 统计初始字符串中每个字符的出现次数
let mut count = vec![0i64; SIZE];
for ch in s.chars() {
count[(ch as u8 - b'a') as usize] += 1;
}

// 2. 构建转移矩阵
let mut matrix = vec![vec![0i64; SIZE]; SIZE];
for i in 0..SIZE {
let num = nums[i] as usize;
for j in 1..=num {
let idx = (i + j) % SIZE;
matrix[i][idx] = 1;
}
}

// 3. 计算转移矩阵的 t 次幂
let power = Self::matrix_pow(&matrix, t);

// 4. 计算最终计数向量: count * power
let mut final_count = vec![0i64; SIZE];
for i in 0..SIZE {
for j in 0..SIZE {
final_count[i] = (final_count[i] + count[j] * power[j][i]) % MOD;
}
}

// 5. 求和得到最终长度
let mut ans = 0;
for &val in &final_count {
ans = (ans + val) % MOD;
}
ans as i32
}

// 矩阵乘法
fn matrix_mul(a: &Vec<Vec<i64>>, b: &Vec<Vec<i64>>) -> Vec<Vec<i64>> {
let n = a.len();
let mut res = vec![vec![0i64; n]; n];
for i in 0..n {
for k in 0..n {
if a[i][k] == 0 {
continue;
}
let aik = a[i][k];
for j in 0..n {
res[i][j] = (res[i][j] + aik * b[k][j]) % MOD;
}
}
}
res
}

// 矩阵快速幂
fn matrix_pow(mat: &Vec<Vec<i64>>, mut exp: usize) -> Vec<Vec<i64>> {
let n = mat.len();
// 初始化为单位矩阵
let mut res = vec![vec![0i64; n]; n];
for i in 0..n {
res[i][i] = 1;
}

let mut base = mat.clone();
while exp > 0 {
if exp & 1 == 1 {
res = Self::matrix_mul(&res, &base);
}
base = Self::matrix_mul(&base, &base);
exp >>= 1;
}
res
}
}
```

代码说明

· matrix_mul:优化了矩阵乘法,跳过零元素以提高效率。
· matrix_pow:实现了二进制快速幂,将 O(t) 的转换次数优化为 O(log t)。
· 向量与矩阵相乘:注意乘法顺序,最终计数向量 = 初始计数向量 × M^t。

复杂度分析

· 时间复杂度:O(SIZE^3 * log t),其中 SIZE = 26 是常数,因此实际为 O(log t)。
· 空间复杂度:O(SIZE^2),用于存储矩阵。

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

相关文章:

  • Ruby数组:枚举器与块驱动的活体数据工具箱
  • 如何彻底告别网盘限速:LinkSwift网盘直链下载助手完整指南
  • 零训练AI换脸神器:roop-unleashed 5分钟快速入门完整指南
  • Vue v-for 核心原理:key 机制、响应式更新与列表渲染最佳实践
  • Gemma 4本地部署全指南:四大引擎+TurboQuant显存优化实战
  • 嵌入式GUI开发实战:emWin窗口管理器核心API与优化技巧
  • ok-ww鸣潮自动化工具:5分钟掌握智能后台战斗的完整指南
  • 2026年知名的西安展柜/眼镜展柜/西安黄金展柜/西安文物展柜深度厂家推荐 - 品牌宣传支持者
  • Claude工作流实战:50条覆盖认知-操作-集成的工程化技巧
  • WSL2+llama.cpp部署Qwen 3.6-35B-A3B全指南
  • 动态离散选择模型与神经网络结合的UFXP算法优化
  • 2026年比较好的提升机链钩/山东提升机链轮实力工厂推荐 - 品牌宣传支持者
  • Helmholtz方程边界元法:核正则化与H矩阵加速技术详解
  • 2026杭州漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • XNB文件解包打包终极指南:xnbcli命令行工具深度解析
  • P89LPC924/925 ADC触发模式与中断优先级配置实战指南
  • Claude Code本地第三方模型接入:UI层协议劫持工程实践
  • p105出租车数据可视化分析大数据1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码
  • 混合线性动态网络建模:从扩散与定向耦合中辨识复杂系统结构
  • 2026年质量好的矿用圆环链/山东圆环链实力工厂推荐 - 行业平台推荐
  • 嵌入式GUI绘图优化:从emWin基础函数到性能调优实战
  • RELOAD:基于强化学习与元学习的下一代智能查询优化器
  • 嵌入式GUI开发实战:emWin配置与驱动移植全解析
  • 张量网络:从量子物理到AI,破解高维数据与模型压缩的数学工具
  • 2026年靠谱的西安茶叶展柜/眼镜展柜实力工厂推荐 - 行业平台推荐
  • EdgeRemover终极指南:3分钟彻底卸载Windows Edge浏览器的免费解决方案
  • GLM-5.1 Coding Plan 调用指南:信用机制、OpenAPI 直连与避坑配置
  • PotPlayer字幕翻译插件:让外语视频瞬间变中文的神器
  • M2-PALE:融合过程挖掘与MCTS-Minimax搜索的大语言模型可解释性框架
  • 终极英雄联盟智能助手:如何快速提升你的游戏效率