[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; dcol\[0\] = current + 1; for (j, tc) in b.chars().enumerate() { let next = dcol\[j + 1\]; if sc == tc { dcol\[j + 1\] = current; } else { dcol\[j + 1\] = std::cmp::min(current, next); dcol\[j + 1\] = std::cmp::min(dcol\[j + 1\], dcol\[j\]) + 1; } current = next; t_last = j; } } dcol\[t_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);

digits[0] = 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 v[idx], &mut v[i]); }

per(v, idx + 1, res);

unsafe { std::ptr::swap(&mut v[i], &mut v[idx]); }

}

}

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

}

}

相关推荐
鸿乃江边鸟13 小时前
Spark Datafusion Comet 向量化Rust Native--创建Datafusion计划
rust·spark·native
咸甜适中13 小时前
rust的docx-rs库,自定义docx模版批量分页生成一个docx文档(方便打印)(逐行注释)
rust·办公自动化·docx-rs
Vallelonga13 小时前
Rust Option.as_ref() 方法
开发语言·rust
大卫小东(Sheldon)1 天前
GIM 2.0 发布:真正让 AI 提交消息可定制、可控、可项目级优化
git·rust·gim
roamingcode2 天前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot
初恋叫萱萱2 天前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
superman超哥3 天前
Serde 性能优化的终极武器
开发语言·rust·编程语言·rust serde·serde性能优化·rust开发工具
sayang_shao3 天前
Rust多线程编程学习笔记
笔记·学习·rust
鸿乃江边鸟4 天前
Spark Datafusion Comet 向量化Rust Native--读数据
rust·spark·native·arrow
硬汉嵌入式4 天前
基于Rust构建的单片机Ariel RTOS,支持Cortex-M、RISC-V 和 Xtensa
单片机·rust·risc-v