タイトル
住所:https://leetcode.com/problems/word-search/
単語がグリッドに存在する場合、2Dボードや単語を考えると、見つけます。
単語は「隣接」セルが水平方向または垂直方向に隣接するもので順次隣接するセルの文字から構成することができます。同じ文字セルは、複数回使用することはできません。
例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.
DFSの深さ優先探索
分析的思考:
- 二次元アレイのマトリクスサイズの確立と同様に、記録位置は、既に訪問されています。
- 一致した文字列を分析し、trueを返します。
- マトリックスが範囲外になっている、または現在の文字は、行列の現在の位置と一致しない、または位置が使用された場合、偽を返します。
- どこでも2次元マトリクス状にしてもよい出発点として、それを介して2つのループを使用する必要があります。
package backtracking;
// https://leetcode.com/problems/word-search/
public class WordSearch {
public static void main(String[] args) {
WordSearch obj = new WordSearch();
char[][] board = {{'A','B','C','E'},
{'S','F','C','S'},
{'A','D','E','E'}};
//String word = "ABCCED";
//String word = "SEE";
String word = "ABCB";
boolean result = obj.exist(board, word);
System.out.println("result > " + result);
}
public boolean exist(char[][] board, String word) {
// check edge
if (word == null || word.length() == 0) {
return true;
}
if (board == null || board.length == 0 || board[0].length == 0) {
return false;
}
// used boolean
boolean[][] used = new boolean[board.length][board[0].length];
// dfs
for (int row = 0; row < board.length; row++) {
for (int col = 0; col < board[row].length; col++) {
if (dfs(board, word, used, row, col, 0)) {
return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, String word, boolean[][] used, int row, int col, int wordIndex) {
if (word == null || wordIndex == word.length()) {
return true;
}
char currentChar = word.charAt(wordIndex);
if (row < 0 || col < 0
|| row >= board.length || col >= board[row].length
|| currentChar != board[row][col] || used[row][col])
{
return false;
}
// mark use
used[row][col] = true;
boolean result = dfs(board, word, used, row + 1, col, wordIndex + 1)
|| dfs(board, word, used, row - 1, col, wordIndex + 1)
|| dfs(board, word, used, row, col + 1, wordIndex + 1)
|| dfs(board, word, used, row, col - 1, wordIndex + 1);
// mark not use
used[row][col] = false;
return result;
}
}