题目: 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false
思路:文章来源:https://www.toymoban.com/news/detail-489235.html
题解:
根据b站思路讲解,加上力扣c++代码
https://www.bilibili.com/video/BV1qK4y1E7ST/?spm_id_from=333.337.search-card.all.click&vd_source=cc3333a27046bad449a2b6818cc4149c
https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/
该题目可以从二维数组的任意位置进去开始找路径,因此写两个for循环来,如果有一个可以一直递归下去找到路径,返回true
在dfs中,如果超出i或者j的边界或者访问的当前元素不等于word中当前位置的元素,直接false
如果等于了,那么i和j都在范围并且当前元素也等于word当前元素,并且k等于word大小减1的话,
说明遍历到最后一个word元素了,并且也相等,那么直接true。
如果还没到最后一个,那么将当前board[i][j]的值保存到临时变量tmp中,
并将board[i][j]修改为一个可以标志该位置你已经访问的值,防止在上下左右访问的时候,
又访问到该元素,保存到临时变量tmp的目的是,为了等会回溯用。
紧接着,上下左右分别遍历看有没有和下一个word相等的,如果有不断递归,直到长度相等,
再后边加回溯,由于刚刚访问到的时候,修改了该处的值,为了不让重复访问,但是该路径没有找到可行的路
因此,递归返回到上一层去了,需要将该值回溯以下。文章来源地址https://www.toymoban.com/news/detail-489235.html
class Solution {
public:
int m;//行
int n;//列
bool exist(vector<vector<char>>& board,string& word) {
m = board.size();
n = board[0].size();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (dfs(board, word, i, j, 0)) {
return true;
}
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string& word,int i,int j,int k) {
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[k])return false;
if (k == word.size() - 1)return true;
int tmp = board[i][j];
board[i][j] = '#';
bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board,word,i,j+1,k+1) || dfs(board,word,i,j-1,k+1);
board[i][j] = tmp;
return res;
}
};
int main() {
vector<vector<char>> board{{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};
Solution ss;
string word = "ABCCED";
cout << ss.exist(board,word) << endl;
return 0;
}
到了这里,关于剑指 Offer 12 矩阵中的路径的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!