【leetcode】單詞搜索
題目:
給定一個二維網(wǎng)格和一個單詞,找出該單詞是否存在于網(wǎng)格中声搁。
單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成僻焚,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格芹枷。同一個單元格內(nèi)的字母不允許被重復(fù)使用衅疙。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
給定 word = "ABCCED", 返回 true
給定 word = "SEE", 返回 true
給定 word = "ABCB", 返回 false
提示:
board 和 word 中只包含大寫和小寫英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
思路:
使用dfs+回溯法鸳慈,從每一個點出發(fā)進(jìn)行探索饱溢,看指定word是否出現(xiàn)。
有一個與board維度相同的viewed數(shù)組用于記錄探索路徑走芋,為true即為該位置是一個探索路徑绩郎。
必要的剪枝策略。
1翁逞、數(shù)組越界
2肋杖、該節(jié)點已經(jīng)訪問過
3、index位置的字符與字符串中的字符不符
java代碼:
class Solution {
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
boolean[][] viewed = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
boolean res = existDfs(board, word, viewed, i, j, 0);
if (res) {
return true;
}
}
}
return false;
}
private boolean existDfs(char[][] board, String word, boolean[][] viewed, int row, int col, int index) {
//index表示的是當(dāng)前探索的是第幾個詞
if (row < 0 || row >= board.length || col < 0 || col >= board[0].length ||
viewed[row][col] || board[row][col] != word.charAt(index)) {
return false;
}
index++;
if (index == word.length()) {
//word所有字符均匹配上
return true;
}
viewed[row][col] = true;
//注意index已經(jīng)++
boolean right = existDfs(board, word, viewed, row + 1, col, index);
boolean left = existDfs(board, word, viewed, row - 1, col, index);
boolean up = existDfs(board, word, viewed, row, col - 1, index);
boolean down = existDfs(board, word, viewed, row, col + 1, index);
if(right||left||up||down) {
return true;
}else {
viewed[row][col] = false;
return false;
}
}
}