use std::collections::HashMap;
fn main() {
let text = ['J','A','P','A','N','H','O','L','D','I','N','G',];
let pattern = ['H','O','L','D'];
let mut skip = HashMap::new();
for i in 0..(pattern.len() - 1) {
skip.insert(
pattern[i],
pattern.len() - i - 1,
);
}
println!("{:?}", skip);
let mut i = pattern.len() - 1;
while i < text.len() {
let mut flg = true;
for j in 0..pattern.len() {
if text[i-j] != pattern[pattern.len()-1-j] {
flg = false;
break;
}
}
if flg == true {
println!("{}", i - pattern.len() + 1);
break;
} else if skip.get(&text[i]).is_some(){
i += skip[&text[i]];
} else {
i += pattern.len();
}
}
}
Compiling rust v0.1.0 (/home/vagrant/dev/algorithm/rust)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s
Running `target/debug/rust`
{‘H’: 3, ‘O’: 2, ‘L’: 1}
5