首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >dfs是什么意思_英语单词搜索软件

dfs是什么意思_英语单词搜索软件

作者头像
全栈程序员站长
发布2022-09-22 10:12:05
发布2022-09-22 10:12:05
7210
举报

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

代码语言:javascript
复制
示例 1:


输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]
示例 2:


输入:board = [["a","b"],["c","d"]], words = ["abcb"]
输出:[]

提示:

m == board.length n == board[i].length 1 <= m, n <= 12 board[i][j] 是一个小写英文字母 1 <= words.length <= 3 * 104 1 <= words[i].length <= 10 words[i] 由小写英文字母组成 words 中的所有字符串互不相同 题解 Trie+暴力搜索

代码语言:javascript
复制
class Solution { 
   
public:
    static const int N = 3e4 + 10;
    int trie[N][26],cnt[N],idx;
    void insert(string &t){ 
   
        int p = 0;
        for(auto &c : t){ 
   
            int u = c - 'a';
            if(trie[p][u] == 0)trie[p][u] = ++idx;
            p = trie[p][u];
            if(cnt[p] != 1)cnt[p] = -1;
        }
        cnt[p] = 1;
    }
    vector<string>res;
    string t = "";
    int n,m;
    int vis[12][12],dx[4] = { 
   0,1,0,-1},dy[4] = { 
   -1,0,1,0};
    int flag[N] = { 
   0};
    set<string>ss;
    void dfs(int x,int y,vector<vector<char>>& board,int p){ 
   
        if(cnt[p] == 1){ 
   
            if(flag[p] == 0)res.push_back(t),flag[p] = 1;
        }else if(cnt[p] == 0){ 
   
            return;
        }
        if(x < 0 || x >= n || y < 0 || y >= m)return;
        if(vis[x][y])return;
        vis[x][y] = true;
        t.append(1,board[x][y]);
        for(int k = 0;k < 4;k ++){ 
   
            int a = x + dx[k],b = y + dy[k];
            if(trie[p][board[x][y] - 'a'] != 0)
            dfs(a,b,board,trie[p][board[x][y] - 'a']);
        }
        t.erase(t.size() - 1,1);
        vis[x][y] = false;
    }
    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) { 
   
        for(auto &word : words)insert(word);
        cnt[0] = -1;
        n = board.size(),m = board[0].size();
        for(int i = 0;i < n;i ++){ 
   
            for(int j = 0;j < m;j ++){ 
   
                dfs(i,j,board,0);
            }
        }
        return res;
    }
};

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168649.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档