アルゴリズム:バックトラック12単語検索文字列マッチング2次元マトリックス

タイトル

住所: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の深さ優先探索

分析的思考:

  1. 二次元アレイのマトリクスサイズの確立と同様に、記録位置は、既に訪問されています。
  2. 一致した文字列を分析し、trueを返します。
  3. マトリックスが範囲外になっている、または現在の文字は、行列の現在の位置と一致しない、または位置が使用された場合、偽を返します。
  4. どこでも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;
  }
}

ダウンロード

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/WordSearch.java

公開された127元の記事 ウォン称賛12 ビュー20000 +

おすすめ

転載: blog.csdn.net/zgpeace/article/details/103884837