Word Search
/**
* Given a 2D board and a word, find if the word exists in the grid.
* The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring.
* The same letter cell may not be used more than once.
* For example,
* Given board =
* [
["ABCE"],
["SFCS"],
["ADEE"]
]
* word = "ABCCED", -> returns true,
* word = "SEE", -> returns true,
* word = "ABCB", -> returns false.
*/
public class Solution {
public boolean exist(char[][] board, String word) {
if(board == null)
return false;
if(word == null || word.length() == 0)
return true;
boolean[][] visited = new boolean[board.length][board[0].length];
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(DFS(board, i, j, word, 0, visited))
return true;
}
}
return false;
}
private boolean DFS(char[][] board, int i, int j, String word, int len, boolean[][] visited) {
if(visited[i][j] || board[i][j] != word.charAt(len))
return false;
if(len == word.length() - 1)
return true;
visited[i][j] = true;
// walk left;
if(i != 0 && DFS(board, i - 1, j, word, len + 1, visited))
return true;
// walk right;
if(i != board.length - 1 && DFS(board, i + 1, j, word, len + 1, visited))
return true;
// walk up
if(j != 0 && DFS(board, i, j - 1, word, len + 1, visited))
return true;
// walk down
if(j != board[0].length - 1 && DFS(board, i, j + 1, word, len + 1, visited))
return true;
// backtracking
visited[i][j] = false;
return false;
}
}