leetcode 212 单词搜索II

方法一:C++ dfs+string to int的哈希表

 

方法二:使用Trie树

一个别人家的java代码,依赖于Trie树题目中的Trie class 实现;

 python 版:不用新建Trie class:

 

 个人根据java版写的c++:

//Trie树的节点,也可以用结构体
class TrieNode{
public:
    TrieNode *child[26];
    bool isend=false;
    TrieNode(){
        for(auto &c:child){
            c=NULL;
        }
    }
};
//Trie树的类定义
class Trie{
public:
    TrieNode *root;
    Trie(){
        root=new TrieNode();
    }
    void insert(string word){
        TrieNode *p=root;
        for(auto w:word){
            int i=w-'a';
            if(p->child[i]==NULL) p->child[i]=new TrieNode();
            p=p->child[i];
        }
        p->isend=true;
    }
    bool search(string str){
        TrieNode *p=root;
        for(auto s:str){
            int i=s-'a';
            if(p->child[i]==NULL) return false;
            p=p->child[i];
        }
        return p->isend;
    }
    bool presubstr(string str){
        TrieNode *p=root;
        for(auto s:str){
            int i=s-'a';
            if(p->child[i]==NULL) return false;
            p=p->child[i];
        }
        return true;
    }
};
class Solution {
public:
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    set<string> ss;
    Trie trie;//定义一个Trie树对象;
    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
        //method1:先获取最长word的长度,建立word2int的哈希表,然后通过循环dfs或bfs来搜索;
        //method2:Trie树
        vector<string> vs;
        int m=board.size();
        if(m==0) return vs;
        int n=board[0].size();
        if(n==0) return {""};
        //定义是否访问过
        vector<vector<int> > visited(m,vector(n,0));
        //建立words字典树
        for(auto w:words){
            trie.insert(w);
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                dfs(board,i,j,"",visited);
            }
        }
        for(auto s:ss){
            vs.push_back(s);
        }
        return vs;
    }
    void dfs(vector<vector<char>> & board,int x,int y,string str,vector<vector<int> >&visited){
        int m=board.size(),n=board[0].size();
        if(x<0 || x>=m ||y<0 ||y>=n || visited[x][y]) return;
        str.push_back(board[x][y]);
        if(!trie.presubstr(str)) return;//回溯条件,如果字典树中不存在以str为前缀的单词,那么没必要再遍历了;
        if(trie.search(str)) ss.insert(str);
        visited[x][y]=1;
        for(int i=0;i<4;i++){
            dfs(board,x+dx[i],y+dy[i],str,visited);
        }
        visited[x][y]=0;
    }
};

 

posted @ 2019-05-05 16:41  Joel_Wang  阅读(1105)  评论(0编辑  收藏  举报