rustgym/leetcode/
_1268_search_suggestions_system.rs1struct Solution;
2use std::usize;
3
4impl Solution {
5 fn suggested_products(mut products: Vec<String>, search_word: String) -> Vec<Vec<String>> {
6 let mut res = vec![];
7 products.sort_unstable();
8 let n = products.len();
9 let mut prefix = "".to_string();
10 let mut start = 0;
11 for c in search_word.chars() {
12 prefix.push(c);
13 start = start
14 + products[start..]
15 .binary_search(&prefix)
16 .unwrap_or_else(|p| p);
17 let mut list: Vec<String> = vec![];
18 let end = usize::min(start + 3, n);
19 for i in start..end {
20 if products[i].starts_with(&prefix) {
21 list.push(products[i].clone());
22 }
23 }
24 res.push(list);
25 }
26 res
27 }
28}
29
30#[test]
31fn test() {
32 let products = vec_string!["mobile", "mouse", "moneypot", "monitor", "mousepad"];
33 let search_word = "mouse".to_string();
34 let res: Vec<Vec<String>> = vec_vec_string![
35 ["mobile", "moneypot", "monitor"],
36 ["mobile", "moneypot", "monitor"],
37 ["mouse", "mousepad"],
38 ["mouse", "mousepad"],
39 ["mouse", "mousepad"]
40 ];
41 assert_eq!(Solution::suggested_products(products, search_word), res);
42 let products = vec_string!["havana"];
43 let search_word = "havana".to_string();
44 let res: Vec<Vec<String>> = vec_vec_string![
45 ["havana"],
46 ["havana"],
47 ["havana"],
48 ["havana"],
49 ["havana"],
50 ["havana"]
51 ];
52 assert_eq!(Solution::suggested_products(products, search_word), res);
53 let products = vec_string!["bags", "baggage", "banner", "box", "cloths"];
54 let search_word = "bags".to_string();
55 let res: Vec<Vec<String>> = vec_vec_string![
56 ["baggage", "bags", "banner"],
57 ["baggage", "bags", "banner"],
58 ["baggage", "bags"],
59 ["bags"]
60 ];
61 assert_eq!(Solution::suggested_products(products, search_word), res);
62 let products = vec_string!["havana"];
63 let search_word = "tatiana".to_string();
64 let res: Vec<Vec<String>> = vec_vec_string![[], [], [], [], [], [], []];
65 assert_eq!(Solution::suggested_products(products, search_word), res);
66}