• 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;
        }
    };
  • 相关阅读:
    Android内存管理之道
    What a C programmer should know about memory
    Android Bitmap缓存池使用详解
    android 5.0主题风格研究
    最受欢迎的5个Android ORM框架
    目前具体实现 material design 有什么途径?
    计算机的数学要求(?转)
    机器智能公司一览图 | 36氪
    Android中Context
    从源码的角度深入分析Scroller
  • 原文地址:https://www.cnblogs.com/joelwang/p/10813821.html
Copyright © 2020-2023  润新知