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