[功能]bot_command模糊匹配帮助
LovesAsuna opened this issue · comments
命令类型不匹配或者前缀部分匹配时推测出用户想要输入的命令并给出提示
细说一下标题
加上了
这个需求可以用 String , Vec<String>
实现。
我觉得可以把 event_params 单独写一个文档说明一下。README.md 里面留下 bot_command 和 trim_eq 然后链接过去
你晓不晓得 rust 当关键字输入错误时使用什么关键字? 或者类似git clone 写成 clon 的时候是怎么推测出 clone的,rust有没有类似的库?
关键字输入错误是啥意思?推测的话计算一下字符串相似度(最小编辑次数)?或者改一改kmp算法得状态机
lib.rs
pub fn min_distance(s1: String, s2: String) -> usize {
let m = s1.len();
let n = s2.len();
let s1 = s1.into_bytes();
let s2 = s2.into_bytes();
let mut dp = vec![vec![0; n + 1]; m + 1];
for i in 1..=m {
dp[i][0] = i;
}
for j in 1..=n {
dp[0][j] = j;
}
for i in 1..=m {
for j in 1..=n {
if s1[i - 1] == s2[j - 1] {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
}
}
}
dp[m][n]
}
fn min(a: usize, b: usize, c: usize) -> usize {
std::cmp::min(a, std::cmp::min(b, c))
}
main.rs
fn main() {
let candidates = vec!["pull", "clone", "push"];
let mut buffer = String::new();
std::io::stdin().read_line(&mut buffer);
let input = buffer.split(" ").collect::<Vec<_>>();
let tuple = candidates
.iter()
.enumerate()
.map(|(i, &candidate)| {
(
i,
rust::min_distance(candidate.to_owned(), input[0].to_owned()),
)
})
.min_by(|a, b| a.1.cmp(&b.1));
println!("match {}", candidates[tuple.unwrap().0]);
}