Leetcode 212 Solution

This article provides solution to leetcode question 212 (word-search-ii)

https://leetcode.com/problems/word-search-ii

Solution

class TrieNode {
public:
    TrieNode* m_children[26];

    bool m_leaf;

    // Initialize your data structure here.
    TrieNode() {
        m_leaf = false;

        for (int i = 0; i < 26; i++)
            m_children[i] = 0;
    }
};

class Trie {
public:
    Trie() {
        root = new TrieNode();
    }

    // Inserts a word into the trie.
    void insert(string word) {
        TrieNode* nextnode = root;

        for (int i = 0; i < word.size(); i++)
        {
            char ch = word[i];

            if (nextnode->m_children[ch - 'a'] == NULL)
                nextnode->m_children[ch - 'a'] = new TrieNode();

            nextnode = nextnode->m_children[ch - 'a'];
        }

        nextnode->m_leaf = true;
    }

    // Returns if the word is in the trie.
    bool search(string word) {
        TrieNode* nextnode = root;

        for (int i = 0; i < word.size(); i++)
        {
            char ch = word[i];

            if (nextnode->m_children[ch - 'a'] == NULL)
                return false;

            nextnode = nextnode->m_children[ch - 'a'];
        }

        return nextnode->m_leaf;
    }

    // Returns if there is any word in the trie
    // that starts with the given prefix.
    bool startsWith(string prefix) {
        TrieNode* nextnode = root;

        for (int i = 0; i < prefix.size(); i++)
        {
            char ch = prefix[i];

            if (nextnode->m_children[ch - 'a'] == NULL)
                return false;

            nextnode = nextnode->m_children[ch - 'a'];
        }

        return true;
    }

    TrieNode* root;
};


class Solution {
    int m;
    int n;

    set<string> res;
    Trie trie;
public:
    void search(vector<vector<char>>& board, int i, int j, string& str, TrieNode* node)
    {
        char orig = board[i][j];

        if (orig == 0)
            return;

        TrieNode* nextnode = node->m_children[orig - 'a'];
        if (nextnode == NULL)
            return;

        str.push_back(orig);

        if (nextnode->m_leaf)
            res.insert(str);

        board[i][j] = 0;

        if (i > 0)
            search(board, i - 1, j, str, nextnode);
        if (i < m - 1)
            search(board, i + 1, j, str, nextnode);
        if (j > 0)
            search(board, i, j - 1, str, nextnode);
        if (j < n - 1)
            search(board, i, j + 1, str, nextnode);

        board[i][j] = orig;

        str.pop_back();
    }

    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
        vector<string> vres;
        m = board.size();
        if (m == 0)
            return vres;
        n = board[0].size();

        for (auto word : words)
            trie.insert(word);

        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                string str;
                search(board, i, j, str, trie.root);
            }

        for (auto str : res)
            vres.push_back(str);
        return vres;
    }
};