algseq/
epmp.rs

1/// Naive pattern matching.
2/// Compare every position in the text to every position in the pattern.
3pub fn naive(pattern: &String, text: &String) -> Vec<usize> {
4    let pattern_chars = pattern.chars();
5    let text_chars = text.chars();
6
7    let mut positions: Vec<usize> = Vec::new();
8
9    'outter: for i in 0..text.len() {
10        for (j, p) in pattern_chars.clone().enumerate() {
11            // check, if we overflow the boundaries of the text
12            if i + j >= text.len() {
13                return positions;
14            }
15            // quit, if characters do not match
16            if p != text_chars.clone().nth(i + j).unwrap() {
17                continue 'outter;
18            }
19        }
20        positions.push(i);
21    }
22    return positions;
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_naive_simple() {
31        let pattern = "ana".to_string();
32        let text = "banana".to_string();
33
34        let res = naive(&pattern, &text);
35        assert_eq!(res, vec![1, 3]);
36    }
37
38    #[test]
39    fn test_naive_complex() {
40        let pattern = "ban".to_string();
41        let text = "bananbnanabanbnnban".to_string();
42
43        let res = naive(&pattern, &text);
44        assert_eq!(res, vec![0, 10, 16]);
45    }
46}