代码拉取完成,页面将自动刷新
knuth_morris_pratt
(#686)
pub fn knuth_morris_pratt(st: &str, pat: &str) -> Vec<usize> {
if st.is_empty() || pat.is_empty() {
return vec![];
}
let string = st.chars().collect::<Vec<char>>();
let pattern = pat.chars().collect::<Vec<char>>();
// build the partial match table
let mut partial = vec![0];
for i in 1..pattern.len() {
let mut j = partial[i - 1];
while j > 0 && pattern[j] != pattern[i] {
j = partial[j - 1];
}
partial.push(if pattern[j] == pattern[i] { j + 1 } else { j });
}
// and read 'string' to find 'pattern'
let mut ret = vec![];
let mut j = 0;
for (i, &c) in string.iter().enumerate() {
while j > 0 && c != pattern[j] {
j = partial[j - 1];
}
if c == pattern[j] {
j += 1;
}
if j == pattern.len() {
ret.push(i + 1 - j);
j = partial[j - 1];
}
}
ret
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! test_knuth_morris_pratt {
($($name:ident: $inputs:expr,)*) => {
$(
#[test]
fn $name() {
let (input, pattern, expected) = $inputs;
assert_eq!(knuth_morris_pratt(input, pattern), expected);
}
)*
}
}
test_knuth_morris_pratt! {
each_letter_matches: ("aaa", "a", vec![0, 1, 2]),
a_few_seperate_matches: ("abababa", "ab", vec![0, 2, 4]),
unicode: ("അഅഅ", "അ", vec![0, 1, 2]),
unicode_no_match_but_similar_bytes: (&String::from_utf8(vec![224, 180, 133]).unwrap(), &String::from_utf8(vec![224, 180, 132]).unwrap(), vec![]),
one_match: ("ABC ABCDAB ABCDABCDABDE", "ABCDABD", vec![15]),
lots_of_matches: ("aaabaabaaaaa", "aa", vec![0, 1, 4, 7, 8, 9, 10]),
lots_of_intricate_matches: ("ababababa", "aba", vec![0, 2, 4, 6]),
not_found0: ("abcde", "f", vec![]),
not_found1: ("abcde", "ac", vec![]),
not_found2: ("ababab", "bababa", vec![]),
empty_string: ("", "abcdef", vec![]),
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。