logseq_notes/journals/2023_04_25.md
2023-06-14 14:27:22 +08:00

3.8 KiB

  • Leetcode - Word Search collapsed:: true
    • Times:
      • Time when completed: 10:47
      • Time taken to complete: 30mins
      • DONE Revisions: SCHEDULED: <2023-05-30 Tue> :LOGBOOK:
        • State "DONE" from "LATER" [2023-05-11 Thu 20:29]
        • State "DONE" from "LATER" [2023-05-23 Tue 20:26] :END:
    • Tags:
      • Algorithms: #DFS #DFS_preorder #backtrack
      • Data structures: #vector_2d
      • Difficulty: #difficulty_medium
      • Platforms: #leetcode
    • Links:
    • Problem:
      • Given an m x n grid of characters board and a string word, return true if word exists in the grid.
      • The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter cell may not be used more than once.
      • Follow up: Could you use search pruning to make your solution faster with a larger board?
    • Examples:
    • Constraints:
      • m == board.length
      • n = board[i].length
      • 1 <= m, n <= 6
      • 1 <= word.length <= 15
      • board and word consists of only lowercase and uppercase English letters.
    • Thoughts:
      • Intuition:
        • The solution is simple, first loop over the board to find a starting point, then start dfs there.
        • The only caveat is remember to add a simple backtracking to prevent the case when a route is invalid, but still used the visited[][] array.
      • Approach:
        • Loop over the board
        • DFS from that point
    • Solution:
      • Code
        • class Solution {
              boolean[][] visited;
              boolean dfs(char[][] board, String word, int x, int y, int start) {
                  if (start == word.length()) {
                      return true;
                  }
                  if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) {
                      return false;
                  }
                  if (visited[x][y]) {
                      return false;
                  }
                  if (board[x][y] == word.charAt(start)) {
                      visited[x][y] = true;
                      boolean found = dfs(board, word, x + 1, y, start + 1) ||
                      dfs(board, word, x - 1, y, start + 1) ||
                      dfs(board, word, x, y + 1, start + 1) ||
                      dfs(board, word, x, y - 1, start + 1);
                      if (!found) { // the backtracking
                          visited[x][y] = false;
                          return false;
                      } else {
                          return true;
                      }
                  } else {
                      return false;
                  }
              }
              public boolean exist(char[][] board, String word) {
                  visited = new boolean[board.length][board[0].length];
                  // first, loop over the problems, then use dfs.
                  for (int i = 0; i < board.length; i++) {
                      for (int j = 0; j < board[0].length; j++) {
                          if (word.charAt(0) == board[i][j]) {
                              visited = new boolean[board.length][board[0].length];
                              if (dfs(board, word, i, j, 0)) {
                                  return true;
                              }
                          }
                      }
                  }
                  return false;
              }
          }