力扣79. 单词搜索

这篇具有很好参考价值的文章主要介绍了力扣79. 单词搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回溯

  • 思路:
    • 定义函数 check(i,j,k) 为网格 (i,j) 位置出发能够搜索到单词 word(k),如果搜索到返回 true,否则返回 false;
    • 搜索规则:
      • 【R1】如果 board[i][j] != word[k],直接返回 false;
      • 【R2】如果当前已经访问到字符串的末尾,且对应字符依然匹配,此时直接返回 true;
      • 【R3】否则,遍历当前位置的所有相邻位置。如果从某个相邻位置出发,能够搜索到子串 word[k + 1],则返回 true,否则返回 false;
    • 更新行列号可以通过{上、下、左、右},行列号不能越界,使用一个网格数组维护使用状态:
      •         // 更新行列号
                for (auto & d : directions) {
                    int r = i + d[0];
                    int c = j + d[1];
                    // 行列号不能越界
                    if (r >= 0 && r < board.size() && c >= 0 && c < board[0].size()) {
                        // 当前格子没有被使用
                        if (!visited[r][c]) {
                            bool flag = dfs(board, word, visited, r, c, k +1);
                            if (flag) {
                                result = true;
                                break;
                            }
                        }
                    }
                }
        
        private:
                int directions[4][2] = {
                    // right
                    {0, 1},
                    // left
                    {0, -1},
                    // down
                    {1, 0},
                    // up
                    {-1, 0}
                };
  • 完整代码:
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int row = board.size();
        if (0 == row) {
            return false;
        }
        int column = board[0].size();
        if (0 == column) {
            return false;
        }
        std::vector<std::vector<int>> visited(row, std::vector<int>(column));

        for (int i  = 0; i < row; ++i) {
            for (int j = 0; j < column; ++j) {
                bool flag = dfs(board, word, visited, i, j, 0);
                if (flag) {
                    return true;
                }
            }
        }

        return false;
    }

private:
    bool dfs(std::vector<std::vector<char>>& board, std::string word, 
        std::vector<std::vector<int>>& visited, int i, int j, int k) {
        if (board[i][j] != word[k]) {
            return false;
        } else if (k == word.size() - 1) {
            return true;
        }
        visited[i][j] = true;

        bool result = false;
        for (auto & d : directions) {
            int r = i + d[0];
            int c = j + d[1];
            if (r >= 0 && r < board.size() && c >= 0 && c < board[0].size()) {
                if (!visited[r][c]) {
                    bool flag = dfs(board, word, visited, r, c, k +1);
                    if (flag) {
                        result = true;
                        break;
                    }
                }
            }
        }
        visited[i][j] = false;

        return result;
    }

private:
        int directions[4][2] = {
            // right
            {0, 1},
            // left
            {0, -1},
            // down
            {1, 0},
            // up
            {-1, 0}
        };
};

文章来源地址https://www.toymoban.com/news/detail-801035.html

到了这里,关于力扣79. 单词搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • leetcode做题笔记79单词搜索

    给定一个  m x n  二维字符网格  board  和一个字符串单词  word  。如果  word  存在于网格中,返回  true  ;否则,返回  false  。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不

    2024年02月12日
    浏览(36)
  • 剑指 Offer 12. 矩阵中的路径 / LeetCode 79. 单词搜索(深度优先搜索)

    链接:剑指 Offer 12. 矩阵中的路径;LeetCode 79. 单词搜索 难度:中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相

    2024年02月02日
    浏览(42)
  • 79. 单词搜索

    题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台  解题思路:递归+回溯 首先遍历每一个board中的字符,如果该字符和word的第一个字符相等,就从这个位置进行匹配搜索,如果能够找到word,就返回true,board中可能存在多个字符合word中的第一个字符相等的情况,

    2024年02月13日
    浏览(32)
  • 算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

    127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - … - sk: 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两

    2024年04月09日
    浏览(77)
  • 力扣211. 添加与搜索单词 - 数据结构设计

    思路: 设计一棵字典树,每个节点存放单词的一个字符,节点放一个标记位,如果是单词结束则标记; 字典树插入: 字典树默认有 26 个 slot 槽代表 a - z; 遍历单词,如果字符对应槽存在则迭代到子节点,如果不存在则创建; 在单词结尾的节点,将 flag 标记; 字典树查询:

    2024年01月20日
    浏览(55)
  • 算法学习——LeetCode力扣补充篇11(64. 最小路径和、48. 旋转图像 、169. 多数元素、394. 字符串解码、240. 搜索二维矩阵 II )

    64. 最小路径和 - 力扣(LeetCode) 描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→

    2024年04月23日
    浏览(38)
  • 递归算法学习——N皇后问题,单词搜索

    目录 ​编辑 一,N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二,单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 1.题意 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题  研究的是如何将  n  个皇后放置在  n×n  的

    2024年02月09日
    浏览(41)
  • LeetCode(力扣)700. 二叉搜索树中的搜索Python

    https://leetcode.cn/problems/search-in-a-binary-search-tree/ 递归法 迭代

    2024年02月11日
    浏览(34)
  • 每日OJ题_算法_滑动窗口⑦_力扣30. 串联所有单词的子串

    目录 力扣30. 串联所有单词的子串 解析及代码 30. 串联所有单词的子串 - 力扣(LeetCode) 难度 困难 给定一个字符串  s   和一个字符串数组  words 。   words  中所有字符串  长度相同 。   s   中的  串联子串  是指一个包含   words  中所有字符串以任意顺序排列连接起来的

    2024年01月21日
    浏览(46)
  • 力扣(leetcode)第35题搜索插入位置(Python)

    题目链接:35.搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例 2: 输入: nums = [1,3

    2024年01月23日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包