rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

use std::collections::HashSet;

impl Solution {
    fn crack_safe(n: i32, k: i32) -> String {
        let n = n as usize;
        let k = k as usize;
        let mut seq = vec![0; n];
        let mut visited: HashSet<Vec<u8>> = HashSet::new();
        visited.insert(seq.clone());
        let size = k.pow(n as u32);
        Self::dfs(1, &mut visited, &mut seq, k, n, size);
        seq.into_iter().map(|b| (b'0' + b) as char).collect()
    }
    fn dfs(
        start: usize,
        visited: &mut HashSet<Vec<u8>>,
        seq: &mut Vec<u8>,
        k: usize,
        n: usize,
        size: usize,
    ) -> bool {
        if visited.len() == size {
            return true;
        }
        for i in 0..k {
            let mut suffix = seq[start..].to_vec();
            suffix.push(i as u8);
            if visited.insert(suffix.clone()) {
                seq.push(i as u8);
                if Self::dfs(start + 1, visited, seq, k, n, size) {
                    return true;
                };
                seq.pop();
                visited.remove(&suffix);
            }
        }
        false
    }
}

#[test]
fn test() {
    let n = 1;
    let k = 2;
    let res = "01".to_string();
    assert_eq!(Solution::crack_safe(n, k), res);
    let n = 2;
    let k = 2;
    let res = "00110".to_string();
    assert_eq!(Solution::crack_safe(n, k), res);
}