|
26 | 26 | /// assert_eq!(fuzzy_search_match("abc", "abcdefg"), true);
|
27 | 27 | /// ```
|
28 | 28 | pub fn fuzzy_search_match(search_string: &str, reference_string: &str) -> bool {
|
29 |
| - recursive_fuzzy_search(search_string, reference_string) |
| 29 | + fuzzy_search(reference_string, search_string) |
30 | 30 | }
|
31 | 31 |
|
32 |
| -fn recursive_fuzzy_search(search_string: &str, reference_string: &str) -> bool { |
33 |
| - let search_len: usize = search_string.len(); |
34 |
| - let reference_len: usize = reference_string.len(); |
35 |
| - |
36 |
| - if search_string == "" { |
37 |
| - return true; |
38 |
| - } |
39 |
| - |
40 |
| - if reference_string == "" { |
41 |
| - return false; |
42 |
| - } |
43 |
| - |
44 |
| - // Search strings longer than the reference strings are not valid |
45 |
| - if reference_len < search_len { |
46 |
| - return false; |
47 |
| - } |
48 |
| - |
49 |
| - for (search_index, search_value) in search_string.char_indices() { |
50 |
| - // Case where all chars in search string are found |
51 |
| - if search_index == search_len { |
52 |
| - return true; |
53 |
| - } |
54 |
| - |
55 |
| - for (reference_index, reference_value) in reference_string.char_indices() { |
56 |
| - if search_value == reference_value { |
57 |
| - let (_, rhs_reference_substring) = reference_string.split_at(find_next_char_boundary(reference_string, reference_index)); |
58 |
| - let (_, rhs_search_substring) = search_string.split_at(find_next_char_boundary(search_string, search_index)); |
59 |
| - return recursive_fuzzy_search(rhs_search_substring, rhs_reference_substring); |
| 32 | +fn fuzzy_search(reference_string: &str, search_string: &str) -> bool { |
| 33 | + let mut search_iterator = search_string.chars(); |
| 34 | + let mut search = search_iterator.next(); |
| 35 | + |
| 36 | + for ref_char in reference_string.chars() { |
| 37 | + match search { |
| 38 | + Some(search_char) => { |
| 39 | + if search_char == ref_char { |
| 40 | + search = search_iterator.next(); |
| 41 | + continue; |
| 42 | + } |
60 | 43 | }
|
61 |
| - } |
62 |
| - |
63 |
| - return false; |
64 |
| - } |
65 |
| - |
66 |
| - false |
67 |
| -} |
68 |
| - |
69 |
| -fn find_next_char_boundary(string: &str, index: usize) -> usize { |
70 |
| - for offset in 1..string.len() + 1 { |
71 |
| - if string.is_char_boundary(index + offset) { |
72 |
| - return index + offset; |
| 44 | + None => return true |
73 | 45 | }
|
74 | 46 | }
|
75 | 47 |
|
76 |
| - index |
| 48 | + search == None |
77 | 49 | }
|
78 | 50 |
|
79 | 51 |
|
|
0 commit comments