class Solution {
public boolean exist(char[][] board, String word) {
if(board == null) return false;
boolean[][] used = new boolean[board.length][board[0].length];//board.length是行数,board[0].length是列数
for(int row = 0; row < board.length; row++){
for(int col = 0; col < board[0].length; col++){
if(existHelper(board, used, word.toCharArray(), 0, col, row))
return true;
}
}
return false;
}
public boolean existHelper(char[][] board, boolean[][] used, char[] word, int idx, int col, int row){
if(idx == word.length) return true;//word 中所有的元素被找到
if(row < 0 || row >= board.length || col < 0 || col >= board[0].length){
return false;//超出边界
}
if(used[row][col] == true || board[row][col] != word[idx]) return false;
used[row][col] = true;
boolean exist = existHelper(board, used, word, idx + 1, col + 1, row);
if(exist) return true;//自身条件满足,如果它后面的条件都满足,返回true
exist = existHelper(board, used, word, idx + 1, col, row + 1);
if(exist) return true;
exist = existHelper(board, used, word, idx + 1, col, row - 1);
if(exist) return true;
exist = existHelper(board, used, word, idx + 1, col - 1, row);
if(exist) return true;
used[row][col] = false;//要置false
return false;
}
}
归纳:先找到一个相同的,然后找上下左右是否有相同的,不能重复使用