又是一题经典的回溯法,但是本题回溯法的框架和之前的回溯题目不一样,可以进行对比分析。
class Solution {
int dir[][] = {{0,1},{0,-1},{-1,0},{1,0}};
boolean dfs(char[][] board,int[][] vis,int x,int y,int num,String word){
if(board[x][y] != word.charAt(num)) return false;
if(num == word.length()-1) return true;
for(int i = 0; i < 4; i++){
vis[x][y] = 1;
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(xx>=0&&xx<board.length&&yy>=0&&yy<board[0].length&&vis[xx][yy]==0){
//将dfs语句放入if语句判断,可以减少回溯的复杂度,避免程序超时,一开始就是直接一条dfs语句,用例应该都能过,但是时间超时了,最终只过了百分之98个案例
if(dfs(board,vis,xx,yy,num+1,word)) return true;
}
vis[x][y] = 0;
}
return false;
}
public boolean exist(char[][] board, String word) {
int x_len = board.length;
int y_len = board[0].length;
int[][] vis = new int[x_len][y_len];
for(int i = 0; i < x_len; i++){
for(int j = 0; j < y_len; j++){
//返回值只有true和false的小技巧!!
if(dfs(board,vis,i,j,0,word)){
return true;
}
}
}
return false;
}
}
这个代码更加直观简洁!!!!
class Solution {
public boolean exist(char[][] board, String word) {
int[][] visited = new int[board.length][board[0].length];
for (int i=0; i<board.length; i++) {
for (int j=0; j<board[0].length; j++) {
if (board[i][j] == word.charAt(0)) {
visited[i][j] = 1;
if (dfs(board, word, 1, i, j, visited)) return true;
visited[i][j] = 0;
}
}
}
return false;
}
public boolean dfs(char[][] board, String word, int index, int i, int j, int[][] visited) {
if (index == word.length()) {
return true;
}
if (i>0 && visited[i-1][j]==0 && board[i-1][j]==word.charAt(index)) {
visited[i-1][j] = 1;
if (dfs(board, word, index+1, i-1, j, visited)) return true;
visited[i-1][j] = 0;
}
if (i<board.length-1 && visited[i+1][j]==0 && board[i+1][j]==word.charAt(index)) {
visited[i+1][j] = 1;
if (dfs(board, word, index+1, i+1, j, visited)) return true;
visited[i+1][j] = 0;
}
if (j>0 && visited[i][j-1]==0 && board[i][j-1]==word.charAt(index)) {
visited[i][j-1] = 1;
if (dfs(board, word, index+1, i, j-1, visited)) return true;
visited[i][j-1] = 0;
}
if (j<board[0].length-1 && visited[i][j+1]==0 && board[i][j+1]==word.charAt(index)) {
visited[i][j+1] = 1;
if (dfs(board, word, index+1, i, j+1, visited)) return true;
visited[i][j+1] = 0;
}
return false;
}
}
作者:shi-san-dao
链接:https://leetcode-cn.com/problems/word-search/solution/tong-yong-dfs-by-shi-san-dao/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/XDU-Lakers/p/13661167.html