Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(vec_remove_item)]
- use std::collections::HashSet;
- pub fn get_perms(items: Vec<String>) -> Result<HashSet<String>, String> {
- let mut permutations: HashSet<String> = HashSet::new();
- // Handles instances where either one or less items are passed to the function
- if items.len() < 1 {
- return Err("The Items Vec must have items dawg...".to_string())
- } else if items.len() == 1 {
- permutations.insert(items.clone().pop().unwrap());
- return Ok(permutations)
- }
- // Making items available after it gets consumed by iterator
- let items_clone = items.clone();
- for item in items {
- let mut items_copy = items_clone.clone();
- permutations.insert(item.clone());
- items_copy.remove_item(&item);
- complete_perms(&mut permutations, &item.clone(), &items_copy);
- }
- Ok(permutations)
- }
- fn complete_perms(permutations: &mut HashSet<String>, prepended: &String, items: &Vec<String>) {
- println!("{:?}", items);
- let mut items_copy = items.clone();
- if items.len() == 1 {
- permutations.insert(items_copy.pop().unwrap());
- } else {
- for item in items {
- let new_item = format!("{}{}", prepended, item);
- permutations.insert(new_item);
- }
- for item in items {
- let to_be_prepended = format!("{}{}", prepended, item);
- complete_perms(&mut *permutations, &to_be_prepended, &items_copy);
- }
- }
- }
- fn main() {
- let items = vec!["a".to_string(), "b".to_string(), "c".to_string()];
- let perms = get_perms(items);
- for perm in perms {
- println!("{:?}", perm);
- }
- }
Add Comment
Please, Sign In to add comment