[leetcode] Word Search | 二维矩阵找里面的单词
Posted August 24, 2013
on:没啥可说的,对于每个cell,如过和word的开头字母一致,就生成一个新的全是false的visited[][], 进去原matrix开始前后左右的找。直到word的每个字母都找到为止。
要点:之前做的是直接
// left, right, up, down return find(board, i, j - 1, word, index + 1, visited) || find(board, i, j + 1, word, index + 1, visited) || find(board, i - 1, j, word, index + 1, visited) || find(board, i + 1, j, word, index + 1, visited);
这样就挂了!因为往左走的一路已经Update visited[][]了,然后没人去undo它,往右走的一支就直接拿来用了,不就乱套了么!所以在mark true的时候,函数结尾给undo一下,就可以保证一对儿出现,路径在反上来的被清理。
public boolean exist(char[][] board, String word) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == word.charAt(0)) {
boolean found = find(board, i, j, word, 0, new boolean[board.length][board[0].length]);
if (found)
return true;
}
}
}
return false;
}
private boolean find(char[][] board, int i, int j, String word, int index, boolean[][] visited) {
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length)
return false;
if (board[i][j] != word.charAt(index) || visited[i][j])
return false;
visited[i][j] = true;
if (index == word.length() - 1)
return true;
// left, right, up, down
boolean found = find(board, i, j - 1, word, index + 1, visited) || find(board, i, j + 1, word, index + 1, visited)
|| find(board, i - 1, j, word, index + 1, visited) || find(board, i + 1, j, word, index + 1, visited);
visited[i][j] = false;//这样就能保证每次true的能给false回来
return found;
}
Leave a Reply