The best way to learn is with doing and with failures.

Brace expansion ii (Key point: multi dimensional array, string handling, recursive)

pub fn brace(exp: String) -> Vec<String> {
        let mut group : Vec<Vec<Vec<String>>> = Vec::new();
        group.push(Vec::new());
        let mut res = Vec::new();
        let mut level = 0;
        let mut start = 0;
        for (i,c) in exp.chars().enumerate() {
            if c=='{' {
                if level == 0 {
                   start = i+1;
                }
                level = level + 1;
            } else if c=='}' {
                level = level -1;
                if level == 0 {
                    let last = group.len()-1;
                    group[last].push(Solution::brace(exp[start..i].to_string()));
                }
            } else if level == 0 && c == ',' {
                let last = group.len()-1;
                group.push(Vec::new());
            } else if level == 0 {
                let last = group.len()-1;
                let mut v = String::new();
                let mut vv = Vec::new();
                v.push(c);
                vv.push(v);
                group[last].push(vv);
            }
        }
        let mut result_set = HashSet::new();
        for item in group {  //item is vec<vec<string>>> 
            let mut cur = item[0].clone();
            let mut prev = item[0].clone();
            for thing in item[1..].iter() {
               cur = Vec::new(); 
               for p in prev {
                   for q in thing {
                        let r = p.clone()+&q.clone();
                        cur.push(r);
                   }
               }
               prev = cur;
            }
            for ss in prev {
                result_set.insert(ss);
            }
        }
        for ele in result_set {
            res.push(ele);
        }
        res.sort();
	res
}

Car pooling (Key point: array of structs, closure, sort_by)

pub fn car_pooling(trips: Vec<Vec<i32>>, capacity: i32) -> bool {
        #[derive(Debug)]
        struct loc {
            location: i32,
            np: i32,
            pick: i32,
        }
        let mut data = Vec::new();
        for pass in trips {
            data.push(loc{location: pass[1],np: pass[0],pick: 1});
            data.push(loc{location: pass[2],np: pass[0],pick: 0});
        }
        data.sort_by(|a,b| a.location.cmp(&b.location));
        let mut np = 0;
        let mut prev = -1;
        for item in &data {
            if item.location != prev {
                prev = item.location;
                if np > capacity {
                    return false;
                }
            }
            if item.pick == 1 {
                np += item.np;
            } else {
                np -= item.np;
            }
        }
        true
    }

Number of islands (Key point: update a two dimensional array)

pub fn num_is_islands(grid: Vec<Vec<char>>) -> i32 {
        let mut visited = grid.clone();
        let mut res = 0;
        let height = grid.len();
        let width = grid[0].len();
        for row in &mut visited {
            for c in row {
                *c = 0 as char;
            } 
        }

        fn dfs(grid: &Vec<Vec<char>>, visited: &mut Vec<Vec<char>>, i: usize, j: usize, height: usize, width: usize) {
            visited[i][j] = 1 as char;
            if i>0 && visited[i-1][j] == 0 as char && grid[i-1][j] == '1' { dfs(grid,visited,i-1,j,height,width); }
            if j>0 && visited[i][j-1] == 0 as char && grid[i][j-1] == '1' { dfs(grid,visited,i,j-1,height,width); }
            if i<height-1 && visited[i+1][j] == 0 as char && grid[i+1][j] == '1' { dfs(grid,visited,i+1,j,height,width); }
            if j<width-1 && visited[i][j+1] == 0 as char && grid[i][j+1] == '1' { dfs(grid,visited,i,j+1,height,width); }
        }

        for (i,row) in grid.iter().enumerate() {
            for (j,c) in row.iter().enumerate() {
                if *c == '1' && visited[i][j] == 0 as char {
                    res += 1;
                    dfs(&grid,&mut visited,i,j, height, width);
                }
            }
        }
    
        res
    }

improved version

pub fn num_is_islands_improved(grid: Vec<Vec<char>>) -> i32 {
        let mut visited = grid.clone();
        let mut res = 0;
        if grid.len() == 0 || grid[0].len() == 0 {return 0 as i32;}
        let height = grid.len();
        let width = grid[0].len();

        fn dfs(grid: &Vec<Vec<char>>, visited: &mut Vec<Vec<char>>, i: usize, j: usize, height: usize, width: usize) -> i32{
            if (i<0 || i == height || j<0 || j == width || visited[i][j] == '0') {
                return 0 as i32;
            }
            visited[i][j] = '0';
            dfs(grid,visited,i-1,j,height,width);
            dfs(grid,visited,i,j-1,height,width);
            dfs(grid,visited,i+1,j,height,width);
            dfs(grid,visited,i,j+1,height,width);
            return 1 as i32;
        }

        for (i,row) in grid.iter().enumerate() {
            for (j,c) in row.iter().enumerate() {
                    res += dfs(&grid,&mut visited,i,j, height, width);
            }
        }
        res
    }

similar question can also be solved


pub fn max_area_of_island(grid: Vec<Vec<i32>>) -> i32 {
        let mut visited = grid.clone();
        let mut res = 0;
        if grid.len() == 0 || grid[0].len() == 0 {return 0 as i32;}
        let height = grid.len();
        let width = grid[0].len();

        fn dfs(visited: &mut Vec<Vec<i32>>, i: i32, j: i32, height: i32, width: i32) -> i32{
            if (i<0 || i == height || j<0 || j == width || visited[i as usize][j as usize] == 0) {
                return 0 as i32;
            }
            visited[i as usize][j as usize] = 0;
            let mut res = 1;
            res += dfs(visited,i-1,j,height,width);
            res += dfs(visited,i,j-1,height,width);
            res += dfs(visited,i+1,j,height,width);
            res += dfs(visited,i,j+1,height,width);
            res
        }

        for (i,row) in grid.iter().enumerate() {
            for (j,c) in row.iter().enumerate() {
                    let t = dfs(&mut visited,i as i32,j as i32, height as i32, width as i32);
		    if (t>res) {res=t;}
            }
        }
        res
    }

Number of perfect squares (Key point: init array, loop)

```rust pub fn perfect(number: i32) -> i32 { if number <= 0 {return 0;} let mut data = vec![std::i32::MAX;number as usize + 1]; data[0] = 0; for i in 1..number+1 { let mut j = 1; while jj<=i { let t = data[(i-jj) as usize] + 1; if t < data[i as usize] { data[i as usize] = t; } j = j + 1; } } data[number as usize] }