1pub mod hash_factorial {
23 pub fn solve(nums: Vec<i32>) -> Vec<Vec<i32>> {
24 let n = nums.len();
25
26 let count: usize = (1..=n).product();
27
28 let mut results = vec![nums; count];
29
30 for i in 0..count {
31 let result = &mut results[i];
32
33 let mut v = i;
34 for j in (2..=n).rev() {
35 let remainder = v % j;
36
37 if remainder != 0 {
38 let start = n - j;
39 result.swap(start, start + remainder);
40 }
41
42 v = (v - remainder) / j;
43 }
44 }
45
46 results
47 }
48}
49
50pub mod flat_map {
51 pub fn solve(nums: Vec<i32>) -> Vec<Vec<i32>> {
52 struct State {
53 choices: Vec<i32>,
54 result: Vec<i32>,
55 }
56
57 let n = nums.len();
58
59 (0..n)
60 .fold(
61 vec![State {
62 choices: nums,
63 result: Vec::with_capacity(n),
64 }],
65 |results, _| {
66 results
67 .into_iter()
68 .flat_map(|state| {
69 let State { choices, result } = state;
70
71 (0..choices.len())
72 .map(|i| {
73 let mut choices = choices.clone();
74 let mut result = result.clone();
75 let num = choices.remove(i);
76 result.push(num);
77 State { choices, result }
78 })
79 .collect::<Vec<_>>()
80 })
81 .collect()
82 },
83 )
84 .into_iter()
85 .map(|state| state.result)
86 .collect()
87 }
88}
89
90pub mod backtracking {
91 fn backtrack(results: &mut Vec<Vec<i32>>, result: &mut Vec<i32>, choices: Vec<i32>) {
92 if choices.len() == 0 {
93 results.push(result.clone())
94 }
95
96 for (i, choice) in choices.iter().enumerate() {
97 result.push(*choice);
98
99 let mut choices = choices.clone();
100 choices.remove(i);
101
102 backtrack(results, result, choices);
103
104 result.pop();
105 }
106 }
107
108 pub fn solve(nums: Vec<i32>) -> Vec<Vec<i32>> {
109 let mut results = vec![];
110 let mut result = vec![];
111
112 backtrack(&mut results, &mut result, nums);
113
114 results
115 }
116}
117
118#[cfg(test)]
119mod tests {
120 use std::{collections::HashSet, iter::FromIterator};
121
122 #[test]
123 fn problem_0064() {
124 let algorithms = [
125 super::hash_factorial::solve,
127 super::flat_map::solve,
128 super::backtracking::solve,
129 ];
130 for solve in algorithms {
131 {
132 let permutations = solve(vec![1, 2, 3]);
133
134 let permutations: HashSet<Vec<i32>> = permutations.into_iter().collect();
135
136 let res: HashSet<Vec<i32>> = [
137 [1, 2, 3],
138 [1, 3, 2],
139 [2, 1, 3],
140 [2, 3, 1],
141 [3, 1, 2],
142 [3, 2, 1],
143 ]
144 .iter()
145 .map(|arr| arr.to_vec())
146 .collect();
147
148 assert_eq!(permutations, res);
149 }
150
151 {
152 let permutations = solve(vec![1, 2, 3, 4]);
153
154 let permutations: HashSet<Vec<i32>> = permutations.into_iter().collect();
155
156 let res: HashSet<Vec<i32>> = [
157 [1, 2, 3, 4],
158 [1, 2, 4, 3],
159 [1, 3, 2, 4],
160 [1, 3, 4, 2],
161 [1, 4, 2, 3],
162 [1, 4, 3, 2],
163 [2, 1, 3, 4],
164 [2, 1, 4, 3],
165 [2, 3, 1, 4],
166 [2, 3, 4, 1],
167 [2, 4, 1, 3],
168 [2, 4, 3, 1],
169 [3, 1, 2, 4],
170 [3, 1, 4, 2],
171 [3, 2, 1, 4],
172 [3, 2, 4, 1],
173 [3, 4, 1, 2],
174 [3, 4, 2, 1],
175 [4, 1, 2, 3],
176 [4, 1, 3, 2],
177 [4, 2, 1, 3],
178 [4, 2, 3, 1],
179 [4, 3, 1, 2],
180 [4, 3, 2, 1],
181 ]
182 .iter()
183 .map(|arr| arr.to_vec())
184 .collect();
185
186 assert_eq!(permutations, res);
187 }
188 }
189
190 let mut result = None;
191
192 for solve in algorithms {
193 let res = HashSet::<Vec<i32>>::from_iter(solve(vec![1, 2, 3, 4, 5]));
194
195 match result {
196 Some(ref m) => assert_eq!(&res, m),
197 None => result = Some(res),
198 }
199 }
200 }
201}