Word Search II

来源:互联网 发布:linux系统命令及shell 编辑:程序博客网 时间:2024/05/16 20:28

题目地址:点击打开链接

前缀树缓存词组,然后用DFS搜索

class Solution {public:    Solution():root(new TrieNode()){}    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {        vs.clear();        m=board.size();        if(m==0)return vs;        n=board[0].size();        if(n==0)return vs;        for(int i=0;i<words.size();++i)insert(words[i]);        visited=vector<vector<bool>>(m,vector<bool>(n,false));        for(int i=0;i<m;++i){            for(int j=0;j<n;++j){                if(root->children[board[i][j]-'a']!=NULL){                    dfs(board,i,j,string()+board[i][j],root->children[board[i][j]-'a']);                }            }        }        return vs;    }private:    //Trie    struct TrieNode{        bool isLeaf;        TrieNode* children[26];        TrieNode():isLeaf(false){            for(int i=0;i<26;++i)children[i]=NULL;        }    };    TrieNode *root;    void insert(string word){        TrieNode *p=root;        for(int i=0;i<word.size();++i){            if(p->children[word[i]-'a']==NULL){                p->children[word[i]-'a']=new TrieNode();            }            p=p->children[word[i]-'a'];        }        p->isLeaf=true;    }    //board dfs    int m,n;    vector<string> vs;    vector<vector<bool>> visited;    void dfs(vector<vector<char>>& board,int a,int b,string str,TrieNode *rt) {        visited[a][b]=true;        if(rt->isLeaf){            vs.push_back(str);            rt->isLeaf=false;        }        int mm[4][2]={-1,0,1,0,0,1,0,-1};        for(int i=0;i<4;++i){            int x=mm[i][0]+a;            int y=mm[i][1]+b;            if(x>=0&&x<m&&y>=0&&y<n&&!visited[x][y]&&rt->children[board[x][y]-'a']!=NULL){                dfs(board,x,y,str+board[x][y],rt->children[board[x][y]-'a']);            }        }        visited[a][b]=false;    }};


0 0
原创粉丝点击