Leetcode 79 单词搜索 word-search tag 数组 dfs
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
思路:
首先找到word中第一个字母所在位置,然后dfs,在每次遍历中,查找i,j四个方向中的字母,同时记录已经遍历过的位置,防止重复。直到begin==word.size()。表明已经查找完全。
class Solution { public: bool exist(vector<vector<char>>& board, string word) { int m=board.size(); int n=board[0].size(); bool res = false; for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { if(word[0]==board[i][j]) { vector<vector<bool>> use(m,vector<bool>(n,false)); use[i][j]=true; res|=dfs(board,word,i,j,1,use); } } } return res; } bool dfs(vector<vector<char>>& board, string word, int i, int j, int begin, vector<vector<bool>> & use) { if(begin==word.size()) return true; bool res = false; if(i-1>=0&&board[i-1][j]==word[begin]&&!use[i-1][j]) { use[i-1][j]=true; res|=dfs(board,word,i-1,j,begin+1,use); use[i-1][j]=false; } if(i+1<board.size()&&board[i+1][j]==word[begin]&&!use[i+1][j]) { use[i+1][j]=true; res|=dfs(board,word,i+1,j,begin+1,use); use[i+1][j]=false; } if(j-1>=0&&board[i][j-1]==word[begin]&&!use[i][j-1]){ use[i][j-1]=true; res|=dfs(board,word,i,j-1,begin+1,use); use[i][j-1]=false; } if(j+1<board[0].size()&&board[i][j+1]==word[begin]&&!use[i][j+1]){ use[i][j+1]=true; res|=dfs(board,word,i,j+1,begin+1,use); use[i][j+1]=false; } return res; } };
优化的一点是,可以不创建use,而直接修改board来时间路径记录
class Solution { public: bool exist(vector<vector<char>>& board, string word) { int m=board.size(); int n=board[0].size(); bool res = false; for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { if(word[0]==board[i][j]) { board[i][j]='!'; res|=dfs(board,word,i,j,1); board[i][j]=word[0]; } } } return res; } bool dfs(vector<vector<char>>& board, string word, int i, int j, int begin) { if(begin==word.size()) return true; bool res = false; if(i-1>=0&&board[i-1][j]==word[begin]) { board[i-1][j]='!'; res|=dfs(board,word,i-1,j,begin+1); board[i-1][j]=word[begin]; } if(i+1<board.size()&&board[i+1][j]==word[begin]) { board[i+1][j]='!'; res|=dfs(board,word,i+1,j,begin+1); board[i+1][j]=word[begin]; } if(j-1>=0&&board[i][j-1]==word[begin]){ board[i][j-1]='!'; res|=dfs(board,word,i,j-1,begin+1); board[i][j-1]=word[begin]; } if(j+1<board[0].size()&&board[i][j+1]==word[begin]){ board[i][j+1]='!'; res|=dfs(board,word,i,j+1,begin+1); board[i][j+1]=word[begin]; } return res; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-04-08 Linux 虚拟内存和物理内存的理解(转)
2018-04-08 unique_ptr与std::move的使用
2018-04-08 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)(转)