トピックリンク
単語検索
トピックの説明
注意点
- 1 <= m、n <= 6
- ボードとワードは英大文字と小文字のみで構成されています
- 同じセル内の文字を繰り返し使用することはできません
ソリューションのアイデア
- 単語全体が含まれているかどうかを検索するには、まず深さ優先探索を使用することが考えられます。まず、行列全体を走査して、文字が単語と同じであるグリッドの位置を見つける必要があります。単語の最初の文字を検索し、単語全体が見つかるまで隣接するグリッドで深さ優先検索を実行します。
- dp を使用して、各グリッドがこの dfs で使用されているかどうかを保存し、同じセル内の文字の再利用が許可されていないことを確認します。
コード
class Solution {
private int targetLength;
public boolean exist(char[][] board, String word) {
int row = board.length, col = board[0].length;
targetLength = word.length();
boolean[][] visited = new boolean[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (dfs(board, word, visited, 0, i, j)) {
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, String word, boolean[][] visited, int depth, int x, int y) {
if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {
return false;
}
if (visited[x][y] || board[x][y] != word.charAt(depth)) {
return false;
}
if (depth + 1 == targetLength) {
return true;
}
visited[x][y] = true;
boolean res = dfs(board, word, visited, depth + 1, x - 1, y)
|| dfs(board, word, visited, depth + 1, x + 1, y)
|| dfs(board, word, visited, depth + 1, x, y - 1)
|| dfs(board, word, visited, depth + 1, x, y + 1);
visited[x][y] = false;
return res;
}
}
キーポイント
- 深さ優先トラバーサルの考え方
- 効率を向上させるために剪定をいつ行うべきか