Word Search II

本文介绍了一种使用前缀树(Trie)和深度优先搜索(DFS)算法来解决单词搜索问题的方法。通过构建前缀树缓存词组,并利用DFS遍历二维字符网格,寻找所有可能组成的单词,最终返回所有找到的单词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:点击打开链接

前缀树缓存词组,然后用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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值