niuhuan / rust_proc_qq

[RUST] 模块化QQ机器人框架 (Based RICQ)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[功能]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]);
}