villey_utils_lib 0.1.0

villey's tools library
Documentation
/**
`add_two` 将指定值加2
```
let arg = 5;
let answer = my_crate::add_two(arg);

assert_eq!(7, answer);
```
 */
pub fn build_next(s: &String) -> Vec<usize> {
    let mut now: usize = 0;
    let mut x = 1;
    let mut res: Vec<usize> = Vec::new();
    res.push(0);
    let s_len = s.chars().count();
    let chars: Vec<char> = s.chars().collect();

    while x < s_len {
        let &now_char: &char = chars.get(now).unwrap();
        let &x_char: &char = chars.get(x).unwrap();

        if now_char == x_char {
            res.push(now);
            x += 1;
            now += 1;
        } else if now != 0 {
            now = res[now - 1]
        } else {
            x += 1;
            res.push(0);
        }
    }
    return res;
}

pub fn search(s_o: &String, s_t: &String) {
    let b_next = build_next(s_o);
    let t_len = s_t.chars().count();
    let o_len = s_o.chars().count();
    let chars_o: Vec<char> = s_o.chars().collect();
    let chars_t: Vec<char> = s_t.chars().collect();

    let mut o_i = 0;
    let mut t_i = 0;
    let mut found = false;
    while t_i < t_len {
        let &char_o = chars_o.get(o_i).unwrap();
        let &char_t = chars_t.get(t_i).unwrap();
        if char_o == char_t {
            o_i += 1;
            t_i += 1;
        } else if o_i != 0 {
            o_i = b_next[o_i - 1]
        } else {
            t_i += 1;
        }

        if o_i == o_len {
            println!("找到子串了!位置在 {}", t_i - o_len);
            found = true;
            break;
        }
    }

    if !found {
        println!("不包含子串")
    }
}