首页 > 其他 > 详细

【LeetCode】79. 单词搜索(回溯的另一种框架)

时间:2020-09-13 15:30:17      阅读:59      评论:0      收藏:0      [点我收藏+]

题目链接

79. 单词搜索

题目描述

技术分享图片

解题思路

又是一题经典的回溯法,但是本题回溯法的框架和之前的回溯题目不一样,可以进行对比分析。

AC代码

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【LeetCode】79. 单词搜索(回溯的另一种框架)

原文:https://www.cnblogs.com/XDU-Lakers/p/13661167.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!