「回溯算法」LeetCode79. 单词搜索

「回溯算法」LeetCode79. 单词搜索

DFS回溯算法Flood Fill算法

本文章参考了许多他人的笔记,仅供自己学习复习使用。
leetcode官网
liweiwei李威威:解答多为java编写,思路非常清晰,读他的笔记对学习很有帮助。
负雪明烛:偶然在知乎看到,受到其leetcode刷题建议的指导。5 年在 CSDN 上更新了 800多道题解,收获 160万 阅读。在中文力扣日更题解。


问题描述

提示:这里描述项目中遇到的问题:

例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
在这里插入图片描述
在这里插入图片描述


题目分析:

问题思路:
我们首先先遍历二维矩阵,只要找到了这个单词的首字母,就可以在这个起点上搜索第 2 个字符,搜索字符的过程,应该注意一点,那就是,在尝试搜索的时候,已经搜索过的地方应该占住这个位置,如果四个方向都搜索不到结果,就应该释放对当前结点的占用,回退上上一格,继续搜索。(转载自: https://liweiwei1419.gitee.io/leetcode-algo/2018/02/06/leetcode-solution/backtracking-6/)

代码tips:
1、使用方向数组,表示 上下左右 4 个方向(具体方向根据题目要求可能变化);
2、使用 marked 数组标记当前位置是否被使用过(marked数组的具体体现可能变化,如本题,会对像素点的颜色进行修改,修改之后相当于标记了当前位置已被访问);
3、判断当前位置是否越界

实现代码1(C++,DFS)

class Solution {
public:
    int dir[4][4]={{-1,0}, {0, -1}, {1, 0}, {0, 1}};
    

    // 判断是否存在单词的函数
    bool exist(vector<vector<char>>& board, string word) {

        // 图的行数m和列数n
        int m=board.size();
        int n=board[0].size();
        vector<vector<bool>> visited(m,vector<bool>(n));
       
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(dfs(i,j,0,board,word,visited))
                    return true;
            }
        }

        return false;
    }

    //dfs函数
     bool dfs(int x,int y,int index,vector<vector<char>>& board,string &word,vector<vector<bool>>& visited){

         // 当index等于最后一个字符的下标:
         // 判断当前board和word所指向的字母是否一样,是则返回true
       
        if(index == word.size()-1){
            return word[index]==board[x][y];
        }

         // 当index没到最后一个字符时:
         // 判断当前board和word所指向的字母是否一样,是则标记visited,并返回true
        if(word[index]==board[x][y]){
            visited[x][y]=true;
            for(int i=0;i<4;i++){
                int nx=x+dir[i][0];
                int ny=y+dir[i][1];
                if(nx >= 0 && nx < board.size()&& ny >= 0 && ny < board[0].size() && !visited[nx][ny]){
                    if(dfs(nx,ny,index+1,board,word,visited)){
                        return true;
                    }
                }
            }
            visited[x][y]=false;//若此路不通,需还原状态
        }
        return false;
    }
};

/*pay attention:
(1)低级错误:传参时nx、ny写成x、y,导致了runtimeError
(2)如何用函数inArea()代替一长串的越界判断?
*/

2022.5.23


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值