algorithmica/
subset.rs

1pub fn subset_util<T>(
2    arr: &[T],
3    st: usize,
4    end: usize,
5    reserve: &mut Vec<T>,
6    subsets: &mut Vec<Vec<T>>,
7) where
8    T: Clone,
9{
10    for index in st..end {
11        reserve.push(arr[index].clone());
12        subsets.push(reserve.clone());
13        subset_util(arr, index + 1, end, reserve, subsets);
14        reserve.pop();
15    }
16}
17
18/// This method will give all subsets of a set which is cloneable
19/// pub fn find_all_subset<T>(arr: &[T]) -> Vec<Vec<T>> where  T: Clone
20///
21/// # Examples
22/// ```rust
23/// use algorithmica::subset::find_all_subset;
24/// let v = vec![1, 2, 3];
25/// assert_eq!(
26///            find_all_subset(&v),
27///            vec![
28///                vec![1],
29///                vec![1, 2],
30///                vec![1, 2, 3],
31///                vec![1, 3],
32///                vec![2],
33///                vec![2, 3],
34///                vec![3]
35///            ]
36///        );
37/// ```
38pub fn find_all_subset<T>(arr: &[T]) -> Vec<Vec<T>>
39where
40    T: Clone,
41{
42    let mut subsets = vec![];
43    let mut reserve = vec![];
44    subset_util(arr, 0, arr.len(), &mut reserve, &mut subsets);
45    subsets
46}
47
48#[cfg(test)]
49mod test {
50    use super::*;
51    #[test]
52    fn subset_test_string() {
53        let v = vec!["A".to_string(), "B".to_string(), "C".to_string()];
54        assert_eq!(
55            find_all_subset(&v),
56            vec![
57                vec!["A"],
58                vec!["A", "B"],
59                vec!["A", "B", "C"],
60                vec!["A", "C"],
61                vec!["B"],
62                vec!["B", "C"],
63                vec!["C"]
64            ]
65        );
66    }
67
68    #[test]
69    fn subset_test_int() {
70        let v = vec![1, 2, 3];
71        assert_eq!(
72            find_all_subset(&v),
73            vec![
74                vec![1],
75                vec![1, 2],
76                vec![1, 2, 3],
77                vec![1, 3],
78                vec![2],
79                vec![2, 3],
80                vec![3]
81            ]
82        );
83    }
84}