Leetcode 79. Word Search 笔记

343 阅读1分钟

Medium

思路

  • 和number island相似
  • 以每个单词的首字母为起点进行DFS
  • 时间复杂度: O(4^n), 4是4个方向, n是word的长度,这是最坏的情况,每次搜索完整个二维数组。

过程

  • 遍历二维数组,寻找给定单词的首字母
  • 找到后进行DFS
  • DFS base case: 当index == word.lengrh() return true,这表明已经递归找到最后一位,直接返回true
  • 当i, j超出边界,或任何一个字符不满足条件,直接返回false
  • 为防止同一个字母被重复使用,每走过一个字符,标记为一个特殊字符
  • 当以一个字符为首字母的DFS完成后,要还原改为特殊字符的位置
  • 在主函数中,返回值为true,则立刻以true结束,false则要等到最后

代码

class Solution {
    public boolean exist(char[][] board, String word) {
        if(word == null) return true;
        if(board == null || board.length == 0 || board[0].length == 0) return false;
        
        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < board[0].length; j++){
                if(dfs(board, word, 0, i, j)) 
                    return true;
            }
        }
        return false;
    }
    
    private boolean dfs(char[][] board, String word, int index, int i, int j){
        if(index == word.length()) return true;
        if(i < 0 || i >= board.length ||j < 0 || j >= board[0].length || board[i][j] != word.charAt(index)) return false;
        
        char old = board[i][j];
        board[i][j] = '.';
        
        boolean res = dfs(board, word, index + 1, i + 0, j + 1)||dfs(board, word, index + 1, i - 1, j)||dfs(board, word, index + 1, i + 0, j - 1)||dfs(board, word, index + 1, i + 1, j + 0);
        board[i][j] = old;
        return res;
            

        
    }
}