rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

impl Solution {
    fn expand(s: String) -> Vec<String> {
        let mut v: Vec<Vec<char>> = vec![];
        let mut stack: Vec<char> = vec![];
        let mut inbrace = false;
        for c in s.chars() {
            match c {
                '{' => {
                    inbrace = true;
                }
                '}' => {
                    stack.sort_unstable();
                    v.push(stack);
                    stack = vec![];
                    inbrace = false;
                }
                ',' => {}
                _ => {
                    if inbrace {
                        stack.push(c);
                    } else {
                        v.push(vec![c]);
                    }
                }
            }
        }
        let n = v.len();
        let mut cur = vec![];
        let mut res = vec![];
        Self::dfs(0, &mut cur, &mut res, &v, n);
        res
    }

    fn dfs(start: usize, cur: &mut Vec<char>, all: &mut Vec<String>, v: &[Vec<char>], n: usize) {
        if start == n {
            all.push(cur.iter().copied().collect());
        } else {
            for &c in &v[start] {
                cur.push(c);
                Self::dfs(start + 1, cur, all, v, n);
                cur.pop();
            }
        }
    }
}

#[test]
fn test() {
    let s = "{a,b}c{d,e}f".to_string();
    let res: Vec<String> = vec_string!["acdf", "acef", "bcdf", "bcef"];
    assert_eq!(Solution::expand(s), res);
    let s = "abcd".to_string();
    let res: Vec<String> = vec_string!["abcd"];
    assert_eq!(Solution::expand(s), res);
}