• LeetCode //C - 79. Word Search


    79. Word Search

    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.
     

    Example 1:

    在这里插入图片描述

    Input: board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
    Output: true

    Example 2:

    在这里插入图片描述

    Input: board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
    Output: true

    Example 3:

    在这里插入图片描述

    Input: board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
    Output: false

    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.

    From: LeetCode
    Link: 79. Word Search


    Solution:

    Ideas:

    Main Idea:
    The main concept here is to use Depth First Search (DFS) to explore the board. Starting from each cell, the algorithm tries to construct the word by moving either horizontally or vertically through adjacent cells. While doing so, the algorithm makes sure not to use the same cell more than once.

    Details:
    1. Starting Point:

    • The function exist iterates through every cell in the board. For each cell, it checks if the word can be formed starting from that cell by invoking the dfs function.

    2. DFS Function (dfs):

    • The purpose of this function is to explore all possible paths from a given cell (i, j) to see if the word can be constructed.
    • It first checks if the current cell’s value matches the current character of the word (word[index]). If not, it returns false.
    • If the cell’s value matches the last character of the word, it means the word is found, and it returns true.
    • If the cell’s value matches the current character but is not the last character of the word, it proceeds to search in all four directions: up, down, left, and right.

    3. Avoiding Revisiting the Same Cell:

    • To ensure the same cell is not used more than once, the function temporarily marks the current cell as visited by setting its value to 0 (or any character that is not a valid board character). This is a kind of “backtracking”.
    • After exploring all paths from the current cell, its original value is restored, which undoes the “marking”.

    4. Result:

    • If at any point during the search, the dfs function finds the word, it returns true to the main exist function.
    • If the word is not found starting from any cell in the board, the exist function returns false.
    Code:
    bool dfs(char** board, int i, int j, char* word, int index, int boardSize, int boardColSize) {
        // Base case: if the current position is out of bounds or the current character does not match
        if (i < 0 || i >= boardSize || j < 0 || j >= boardColSize || board[i][j] != word[index]) {
            return false;
        }
    
        // If we've reached the end of the word, then we've found a match
        if (index == strlen(word) - 1) {
            return true;
        }
    
        char tmp = board[i][j];
        board[i][j] = 0;  // Mark the cell as visited
    
        // Recursively search for the next character in all four directions (up, down, left, right)
        bool found = dfs(board, i + 1, j, word, index + 1, boardSize, boardColSize)
                  || dfs(board, i - 1, j, word, index + 1, boardSize, boardColSize)
                  || dfs(board, i, j + 1, word, index + 1, boardSize, boardColSize)
                  || dfs(board, i, j - 1, word, index + 1, boardSize, boardColSize);
    
        board[i][j] = tmp;  // Restore the cell value after the DFS
    
        return found;
    }
    
    bool exist(char** board, int boardSize, int* boardColSize, char* word) {
        for (int i = 0; i < boardSize; i++) {
            for (int j = 0; j < boardColSize[0]; j++) {
                // Start the DFS search from each cell in the board
                if (dfs(board, i, j, word, 0, boardSize, boardColSize[0])) {
                    return true;
                }
            }
        }
        return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    Centos安装Redis --使用wget
    【MATLAB第73期】# 源码分享 | 基于MATLAB的不同类型数据排列方式合集
    vue3后台管理框架之技术栈
    mysqld_exporter无法连接mysql解决
    初始MySQL(六)(自增长,索引,事务,隔离级别)
    openwrt使用教程
    LVS+keepalived高可用负载均衡集群
    全渠道定价、库存决策,混合整数规划建模求解,MNL选择模型,内附代码!
    基于springboot+vue+elementui的游戏攻略分享平台
    C/C++语言100题练习计划 85——统计方形(枚举实现)
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133847668