fn get_distance(s1: String, s2: String) -> i32 {
let chars1 = s1.chars().collect::<Vec<char>>();
let chars2 = s2.chars().collect::<Vec<char>>();
let len1 = s1.chars().count();
let len2 = s2.chars().count();
let mut d = vec![vec![0i32; len1 + 1]; len2 + 1];
for i in 0 .. len1 {
d[i][0] = i as i32;
}
for i in 0 .. len2 {
d[0][i] = i as i32;
}
for i in 1 .. len1 + 1 {
for j in 1 .. len2 + 1 {
let mut cost = 1;
if chars1[i-1] == chars2[j-1] {
cost = 0;
}
let delete = d[i-1][j] + 1;
let insert = d[i][j-1] + 1;
let substitution = d[i-1][j-1] + cost;
d[i][j] = min(delete, insert, substitution);
}
}
d[len1][len2]
}
fn min(d: i32, i: i32, s: i32) -> i32 {
let temp = if d > i { i } else { d };
if s < temp {
s
} else {
temp
}
}
pub fn main() {
println!("{}", get_distance("wsdjeg".to_string(), "wdsjgh".to_string()));
}
刚开始接触Rust的时候很多示例代码都是单文件的,随着学习的深入,单个文件里面的代码量越来越大。
此时就需要将单个文件拆分成多个文件。Rust里面关键字mod可以用来定义一个模块,或者载入一个模块文件。
假定,我们拥有如下文件结构:
rustmod
├── Cargo.toml
└── src
└── main.rs
此时,新建一个文件src/util.rs,加入如下内容:
pub fn hello_mod() {
println!("{}", "hello mod");
}
此时,就可以在main.rs内使用mod util引入util.rs文件了:
mod util;
fn main() {
util::hello_mod();
}
以上代码块,使用mod util;载入模块文件,同时在main函数里调用util::hello_mod()函数,需要说明的是,该函数需要使用pub
关键字进行申明。
rustmod
├── Cargo.toml
└── src
├── main.rs
├── function.rs
└── util.rs
比如,在编写 function.rs 内代码时,偶尔需要使用到uril.rs里面一些常用的工具函数,该如何操作呢?
// rustmod/src/function.rs
use crate::util;
fn hello_function() {
util::hello_mod();
}
假定有如下目录结构:
rustmod
├── Cargo.toml
└── src
├── main.rs
├── function.rs
└── util.rs
xxx
├── Cargo.toml
└── src
└── lib.rs
修改rustmod/Cargo.toml:
[package]
name = "testmod"
version = "0.1.0"
authors = ["Shidong Wang"]
edition = "2018"
[dependencies]
xxx = {path= "../xxx" }
此时,就可以在rustmod/src/main.rs内通过extern crate xxx;来引入xxx,修改main.rs:
extern crate xxx;
use xxx::xxx_func;
fn main() {
xxx_func();
}
在写一个 rust 小工具,需要通过参数读取文件内容,以往使用的一些工具,除了支持通过参数读取指定 文件内容之外,还支持读取 stdin。比如:
cat test.py | python
python test.py
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
for line in stdin.lock().lines() {
println!("{}", line.unwrap());
}
}
在搜索 Rust 相关资料,无意间看到 v2ex 上面的一些字符串相关的问题, 于是使用 rust 来测试下。
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
pub fn main() {
println!("{}", find_longest("aaaa"));
}
fn find_longest(st: &str) -> i32 {
let mut i = 1;
let mut rst = 1;
let mut temp: String = String::new();
for c in st.chars() {
if temp.contains(c) {
i = 1;
temp.clear();
temp.push(c);
} else {
i += 1;
temp.push(c);
}
if i > rst {
rst = i;
}
}
rst - 1
}
因为需要书写一些英文文档,有些英文单词太长,因此需要一个英文单词补全工具。 之前在 Linux 系统下面使用了 look 命令,和 noco-look 插件。但是换到 Windows 下之后,发现居然没有 look 这个命令。
恰巧,最近在学习 rust,于是就用 rust 简单写了一个字典补全的 Vim 插件:vim-async-dict
因为现有的工具已经非常齐全了,因此并未从头实现,补全框架使用的是 deoplete, 只需要新建一个 dict source:
from os.path import expanduser, expandvars
import re
import subprocess
from .base import Base
class Source(Base):
def __init__(self, vim):
Base.__init__(self, vim)
self.name = 'dict'
self.mark = '[D]'
self.min_pattern_length = 3
有了 source 之后,需要在新建一个命令行工具,接受 2 个参数,查询词和字典文件路径:
impl Config {
#[allow(dead_code)]
fn new(args: &[String]) -> Result<Config, &'static str> {
if args.len() < 3 {
return Err("not enough arguments");
}
let query = args[1].clone();
let filename = args[2].clone();
Ok(Config { query, filename })
}
}
pub fn main() {
println!("{}", "ssss");
}
pub fn main() {
println!("{}", 1); // 默认用法,打印Display
println!("{:o}", 9); // 八进制
println!("{:x}", 255); // 十六进制 小写
println!("{:X}", 255); // 十六进制 大写
println!("{:p}", &0); // 指针
println!("{:b}", 15); // 二进制
println!("{:e}", 10000f32); // 科学计数(小写)
println!("{:E}", 10000f32); // 科学计数(大写)
println!("{:?}", "test"); // 打印Debug
println!("{:#?}", ("test1", "test2")); // 带换行和缩进的Debug打印
println!("{a} {b} {b}", a = "x", b = "y"); // 命名参数
}
>: 右对齐<: 左对齐^: 居中对齐pub fn main() {
// @question 关于字符串对齐
println!("{0:>0w$}", 9, w=6); // 八进制
}
format_string := <text> [ format <text> ] *
format := '{' [ argument ] [ ':' format_spec ] '}'
argument := integer | identifier
format_spec := [[fill]align][sign]['#'][0][width]['.' precision][type]
fill := character
align := '<' | '^' | '>'
sign := '+' | '-'
width := count
precision := count | '*'
type := identifier | ''
count := parameter | integer
parameter := integer '$'