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;
}
}