Guest User

Untitled

a guest
May 27th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. #![feature(vec_remove_item)]
  2.  
  3. use std::collections::HashSet;
  4.  
  5. pub fn get_perms(items: Vec<String>) -> Result<HashSet<String>, String> {
  6.  
  7. let mut permutations: HashSet<String> = HashSet::new();
  8.  
  9. // Handles instances where either one or less items are passed to the function
  10. if items.len() < 1 {
  11. return Err("The Items Vec must have items dawg...".to_string())
  12. } else if items.len() == 1 {
  13. permutations.insert(items.clone().pop().unwrap());
  14. return Ok(permutations)
  15. }
  16.  
  17. // Making items available after it gets consumed by iterator
  18. let items_clone = items.clone();
  19.  
  20. for item in items {
  21. let mut items_copy = items_clone.clone();
  22. permutations.insert(item.clone());
  23. items_copy.remove_item(&item);
  24. complete_perms(&mut permutations, &item.clone(), &items_copy);
  25. }
  26.  
  27. Ok(permutations)
  28. }
  29.  
  30. fn complete_perms(permutations: &mut HashSet<String>, prepended: &String, items: &Vec<String>) {
  31. let mut items_copy = items.clone();
  32.  
  33. if items.len() == 1 {
  34. permutations.insert(items_copy.pop().unwrap());
  35. } else {
  36. for item in items {
  37. let new_item = format!("{}{}", prepended, item);
  38. permutations.insert(new_item);
  39. }
  40. for item in items {
  41. let to_be_prepended = format!("{}{}", prepended, item);
  42. complete_perms(&mut *permutations, &to_be_prepended, &items_copy);
  43. }
  44. }
  45. }
  46.  
  47. fn main() {
  48. let items = vec!["a".to_string(), "b".to_string(), "c".to_string()];
  49. let perms = get_perms(items);
  50. for perm in perms {
  51. println!("{:?}", perm);
  52. }
  53. }
Add Comment
Please, Sign In to add comment