Leetcode——矩阵中的路径(回溯,剪枝)
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——矩阵中的路径(回溯,剪枝)相关的知识,希望对你有一定的参考价值。
1. 题目
2. 题解
- 遍历每个单词的所有方向,符合条件的继续,不符合的回溯,重置状态。
class Solution {
int m = 0;
int n = 0;
boolean[][] visited;
int[][] direct = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
public boolean exist(char[][] board, String word) {
m = board.length;
n = board[0].length;
visited = new boolean[m][n];
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
//起点如果不是word的首字符,那就跳过当前位置,不从这里开始遍历
if(board[i][j] != word.charAt(0)){
continue;
}
//如果从(i,j)开始遍历能找到word在网络中,则返回true;否则继续从头开始遍历
if(findWord(board,word,i,j,0,visited)){
return true;
}
}
}
return false;
}
private boolean findWord(char[][] board, String word, int i, int j, int cur,boolean[][] visited){
//如果cur指针越界了,则证明已经找到与word匹配的所有字符了
if(cur==word.length()){
return true;
}
//i和j如果越界则返回false
if(i<0 || j<0 || i>=m || j>=n){
return false;
}
//如果当前网络字符不等于word的第cur个字符
//或者当前字符已经被访问,则false (防止出现A-》B,B忘四个方向遍历时,又回退导致遍历了两次A)
if(board[i][j] != word.charAt(cur) || visited[i][j]){
return false;
}
//回溯,标记已被访问
visited[i][j] = true;
//如果从当前点(i,j)散发的四个方向中有一个方向能成功匹配剩下的字母,则可以返回true
for(int[] dir:direct){
if(findWord(board,word,i+dir[0],j+dir[1],cur+1,visited)){
return true;
}
}
//当前节点所有方向都未找到目标值,恢复原有状态
visited[i][j] = false;
//前面如果没有找到完整匹配的结果则返回false
return false;
}
}
以上是关于Leetcode——矩阵中的路径(回溯,剪枝)的主要内容,如果未能解决你的问题,请参考以下文章