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!("不包含子串")
}
}