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
18pub 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}