[lc-rs] swap|lev_dist源码

lev_dist源码

(没想到在这种时候,编译器还在守护我(╥﹏╥),rustc,你真的)

用于 typo 检查和拼写错误时的候选词的建议。

在 Rust 源码文件夹的 compiler/rustc_span/src/lev_distance.rs。

edit_distance 算法的应用演示:

lvy rust$ rustup dog

: The subcommand 'dog' wasn't recognized

Did you mean 'doc'?

如上所示,输入 rustup dog 时,rustup 不存在 dog 这个子命令,但是它会挨个遍历候选词中最接近的一个词。

最后建议把 dog 改成 doc ,因为 dog 和 doc 之间 edit_distance 最小。

工程项目中可以用 strsim 库提供的 edit_distance 算法,例如过程宏库 darling 和 async-graphql 都用到了 strsim 库


/// https://github.com/rust-lang/rust/blob/master/compiler/rustc_span/src/lev_distance.rs

fn lev_distance(a: &str, b: &str) -> usize {

// cases which don't require further computation

if a.is_empty() {

return b.chars().count();

} else if b.is_empty() {

return a.chars().count();

}

let mut dcol: Vec<_> = (0..=b.len()).collect();

let mut t_last = 0;

for (i, sc) in a.chars().enumerate() {

let mut current = i;

dcol0 = current + 1;

for (j, tc) in b.chars().enumerate() {

let next = dcolj + 1;

if sc == tc {

dcolj + 1 = current;

} else {

dcolj + 1 = std::cmp::min(current, next);

dcolj + 1 = std::cmp::min(dcolj + 1, dcolj) + 1;

}

current = next;

t_last = j;

}

}

dcolt_last + 1

}

lc66

impl Solution {

pub fn plus_one(mut digits: Vec<i32>) -> Vec<i32> {

for d in digits.iter_mut().rev() {

if *d < 9 {

*d += 1; // 进位

return digits;

}

*d = 0; // 进位数字的右边数字都变成 0

}

// digits 全是 9,加一后变成 100...00

digits.push(0);

digits0 = 1;

digits

}

}

lc53

3步,前缀和+贪心

impl Solution {

pub fn max_sub_array(nums: Vec<i32>) -> i32 {

let mut ans = i32::MIN;

let mut min_pre_sum = 0;

let mut pre_sum = 0;

for x in nums {

pre_sum += x; // 当前的前缀和

ans = ans.max(pre_sum - min_pre_sum); // 减去前缀和的最小值

min_pre_sum = min_pre_sum.min(pre_sum); // 维护前缀和的最小值

}

ans

}

}

lc46

利用swap,swap真是个数组的原子操作!熟练掌握swap的使用几乎能完全所有数组的原地变换🥺

pub fn per(v: &mut Vec<i32>, idx: usize, res: &mut Vec<Vec<i32>>) {

if idx == v.len() {

res.push(v.clone());

return;

}

for i in idx..v.len() {

unsafe { std::ptr::swap(&mut vidx, &mut vi); }

per(v, idx + 1, res);

unsafe { std::ptr::swap(&mut vi, &mut vidx); }

}

}

impl Solution {

pub fn permute(mut nums: Vec<i32>) -> Vec<Vec<i32>> {

let len = (2..=nums.len()).product();

let mut res = Vec::with_capacity(len);

per(&mut nums, 0, &mut res);

res

}

}

相关推荐
NutShell Wang34 分钟前
Vite 8.1 深度拆解:Rolldown 统一打包器如何终结前端构建的「双引擎时代」
前端·rust·开源·vite·开发者工具·vibe coding
寒水馨1 小时前
macOS下载、安装uv-0.12.0(附安装包uv-aarch64-apple-darwin.tar.gz)
python·macos·rust·项目管理·包管理器·astral·pip替代
寒水馨2 小时前
macOS下载、安装ripgrep-15.2.0(附安装包ripgrep-15.2.0-aarch64-apple-darwin.tar.gz)
macos·正则表达式·rust·ripgrep·rg·命令行搜索·代码搜索
SomeB1oody17 小时前
【RustyML入门】1.0. 快速上手
开发语言·后端·机器学习·rust·教程
骊城英雄17 小时前
Rust从入门到精通-trait
人工智能·算法·rust
花褪残红青杏小18 小时前
Rust图像处理第23节-图像加噪:给每个像素单独掷一次骰子
rust·webassembly·图形学
小杍随笔1 天前
2025年Rust GUI框架实战万字避坑指南
开发语言·后端·rust
在水一缸2 天前
当 AI 编码助手遇上 Rust:深入解析 Zerostack 的极简哲学与实战应用
rust·系统架构·开源项目·轻量化·ai编码助手·zerostack
2401_873479402 天前
风控引擎高并发IP查询方案对比:开源Rust库 vs 商业离线库,怎么选?
tcp/ip·rust·开源·ip
花褪残红青杏小2 天前
Rust图像处理第22节-从RGB到YCbCr: 让亮度和颜色分家
rust·webassembly·图形学