Guest User

Untitled

a guest
May 27th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 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. println!("{:?}", items);
  32. let mut items_copy = items.clone();
  33.  
  34. if items.len() == 1 {
  35. permutations.insert(items_copy.pop().unwrap());
  36. } else {
  37. for item in items {
  38. let new_item = format!("{}{}", prepended, item);
  39. permutations.insert(new_item);
  40. }
  41. for item in items {
  42. let to_be_prepended = format!("{}{}", prepended, item);
  43. complete_perms(&mut *permutations, &to_be_prepended, &items_copy);
  44. }
  45. }
  46. }
  47.  
  48. fn main() {
  49. let items = vec!["a".to_string(), "b".to_string(), "c".to_string()];
  50. let perms = get_perms(items);
  51. for perm in perms {
  52. println!("{:?}", perm);
  53. }
  54. }
Add Comment
Please, Sign In to add comment