Question:
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 =
[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ]
word = "ABCCED"
, -> returns true
,
word = "SEE"
, -> returns true
,
word = "ABCB"
, -> returns false
.
Solution:
package algorithm;
/**
* @author
* @version V 1.0 2016年4月11日
* @since jdk1.6
*/
// 79. Word Search
public class WordSearch {
public boolean exist(char[][] board, String word) {
boolean flag = false;
int index = 0;
for (int row = 0; row < board.length; row++)
for (int rank = 0; rank < board[row].length; rank++) {
if (board[row][rank] == word.charAt(index)) {
// int[][] idt = new int[board.length][board[0].length];
flag = calc(row, rank, index, board, word);
if (flag)
return true;
}
}
return flag;
}
public boolean calc(int row, int rank, int index, char[][] board, String word) {
char tem = 0 ;
if (row < 0 || rank < 0 || row >= board.length || rank >= board[row].length || index >= word.length()
|| board[row][rank] != word.charAt(index)) {
return false;
}
else if (index == word.length() - 1) {
return true;
} else {
tem = board[row][rank];
board[row][rank] = '-';
boolean flag = (calc(row - 1, rank, index + 1, board, word)
|| calc(row + 1, rank, index + 1, board, word) || calc(row, rank - 1, index + 1, board, word) || calc(
row, rank + 1, index + 1, board, word));
if (!flag)
board[row][rank] = tem;
return flag;
}
}
public static void main(String[] args) {
char[][] board = { { 'a', 'a' }};
String word = "aaa";
/* char[][] board = { { 'a', 'b' }, { 'c', 'd' } };
String word = "cdba";
*/ /* char [][] board = {{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};
String word = "ABCCED";
*/System.out.println(new WordSearch().exist(board, word));
}
}