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;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM