[][src]Function leetcode_for_rust::cd0212_word_search_ii::find_words

pub fn find_words(board: Vec<Vec<char>>, words: Vec<String>) -> Vec<String>

Solutions

Approach : Trie and DFS

  • Time complexity:

  • Space complexity:

  • It doesn't work, I'm sorry

use std::collections::HashSet;

#[derive(Debug, Default)]
pub struct Trie {
    is_end: bool,
    nodes: [Option<Box<Trie>>; 26],
}

impl Trie {

    fn new() -> Self {
        Default::default()
    }

    fn insert(&mut self, word: String) {
        let mut curr = self;
        for i in word.chars().map(|char| (char as u8 - 'a' as u8) as usize) {
            curr = curr.nodes[i].get_or_insert_with(|| Box::new(Trie::new()));
        }
        curr.is_end = true;
    }
}

impl Solution {
    const DIRS: [[i32; 2]; 4] = [[1, 0], [-1, 0], [0, 1], [0, -1]];

    pub fn find_words(mut board: Vec<Vec<char>>, words: Vec<String>) -> Vec<String> {
        let rows = board.len();
        let cols = board[0].len();

        if rows == 0 || cols == 0 || words.len() == 0 { return vec![]; }

        let mut trie = Trie::new();
        let mut result: HashSet<String> = HashSet::new();

        for word in words { trie.insert(word); }

        for row in 0..rows {
            for col in 0..cols {
                let mut s = String::from("");
                Self::_dfs(&mut board, &mut result, &mut s, row, col, &trie);
            }
        }

        result.into_iter().collect::<Vec<String>>()
    }

    pub fn _dfs(board:  &mut Vec<Vec<char>>,
                result: &mut HashSet<String>,
                s:      &mut String,
                row:    usize,
                col:    usize,
                trie:   &Trie) {
        let mut curr = trie;
        if let Some(node) = trie.nodes[(board[row][col] as u8 - 'a' as u8) as usize].as_ref() {
            curr = node;
            s.push(board[row][col]);
            if curr.is_end { result.insert(s.clone()); }
            for d in Self::DIRS.iter() {
                let ni = (row as i32 + d[0]) as usize;
                let nj = (col as i32 + d[1]) as usize;
                if ni >= board.len() || nj >= board[0].len() || board[ni][nj] == '#' { continue; }

                let ch = board[row][col];
                board[row][col] = '#';
                Self::_dfs(board, result, s, ni, nj, curr);
                board[row][col] = ch;
            }
        }
    }
}