Problem 2 Word Search

https://leetcode.com/problems/word-search/description/

思考:

  • 题目中让我们在board上面找word,一个单词其实就是collection of Character,board里的每个cell也是character,board里面找path使得path里的每一个vertex match上这个string里的每个对应的index

Method DFS Mark Visited 3 backtracking

  • High Level

    • 什么是一个解:board上一个单词就是一个解

    • 如何构造一个解

      • 每一层

        • 每一层佳宜个点进到当前的path,在board里加入一个坐标(letter),必须能match上word里对应的index

      • 分支是什么

        • 上下左右四个方向,如果不走回头路只有三个方向

      • 一共有多少层

        • m*n

TC &SC

  • O(m * n * 3^(m*n))

  • O(m* n)

  • 这个大部分都是在expand的时候进行判断

private static final int[][] DIRS = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};

public boolean existWordInGrid(char[][] board, String word) {
    if (board == null || board.length == 0) {
        return false;
    }
    // 从所有点出发开始尝试mark visited一定是每次出发一个新的mark visited
    for (int i = 0; i < board.length - 1; i++) {
        for (int j = 0; j < board[0].length - 1; j++) {
            boolean[][] visited = new boolean[board.length][board[0].length];
            if (backTracking(board, word, visited, i, j, 0)) {
                return true;
            }
        }
    }
    return false;
}

// i, j: 表示board里走到哪里了
// index: String, word里走到哪个index

private boolean backTracking(char[][] board, String word, boolean[][] visited, int i, int j, int index) {
    if (!isValid(board, i, j)) {
        return false;
    }
    if (visited[i][j]) {
        return false;
    }
    if (board[i][j] != word.charAt(index)) {
        return false;
    }
    visited[i][j] = true;
    if (index == word.length() - 1) {
        return true;
    }
    
    for (int[] dir: DIRS) {
        int neiX = i + dir[0];
        int neiY = j + dir[1];
        if (backTracking(board, word, visited, neiX, neiY, index + 1)) {
            return true;
        }
    }
    visited[i][j] = true;
    return false;
}

private boolean isValid(char[][] board, int i, int j) {
    return i >= 0 && i < board.length && j >= 0 && j < board[0].length;
}

Last updated