LeetCode //C - 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:
c 复制代码
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;
}
相关推荐
电鱼智能的电小鱼2 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
孫治AllenSun3 小时前
【算法】图相关算法和递归
windows·python·算法
格图素书4 小时前
数学建模算法案例精讲500篇-【数学建模】DBSCAN聚类算法
算法·数据挖掘·聚类
yuuki2332334 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
DashVector5 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会5 小时前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
夏鹏今天学习了吗5 小时前
【LeetCode热题100(59/100)】分割回文串
算法·leetcode·深度优先
卡提西亚5 小时前
C++笔记-10-循环语句
c++·笔记·算法
还是码字踏实5 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
ad钙奶长高高5 小时前
【C语言】扫雷游戏详解
c语言