当前位置: 首页 > article >正文

leetcode热题100(79. 单词搜索)dfs回溯 c++

链接:79. 单词搜索 - 力扣(LeetCode)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • board 和 word 仅由大小写英文字母组成

进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?、

思路

        对每一个board的位置为初始位置开始枚举,dfs记录一下当前枚举到哪个元素,要是枚举到最后一个元素即可找到解,否则返回false了,

        唯一注意的就是遍历过的位置要把它标记一下避免重复判断,我们可以先让他等于“/0”后面回溯把它变回来即可

代码如下

class Solution {
public:
    int n,m;
    int len;
    int dx[4]={-1,0,1,0};
    int dy[4]={0,-1,0,1};
    bool exist(vector<vector<char>>& board, string word) {
        n = board.size();
        m = board[0].size();
        len = word.size();
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(dfs(i,j,0,board,word)) return true;
            }
        return false;
    }

    bool dfs(int x,int y,int k,vector<vector<char>>& board, string word){
        
        if(x<0||x>=n||y<0||y>=m||word[k]!=board[x][y]) return false;
        //cout<<x<<" "<<y<<" "<<k<<endl;
        board[x][y]='/0'; // 已经遍历过的标记一下,下次不能重复遍历
        if(k==len-1) return true;  //已经找到满足word的字符串返回
        bool flag = false;
        for(int i=0;i<4;i++){
            int a = x+dx[i];
            int b = y+dy[i];
            flag|=dfs(a,b,k+1,board,word);
        }
        board[x][y]=word[k];  //复原,下一次重新遍历
        return flag;
    }
};


http://www.kler.cn/a/461735.html

相关文章:

  • 【74HC192减法24/20/72进制】2022-5-17
  • 无线AP安装注意事项
  • 每日一学——监控工具(Grafana)
  • 软考教材重点内容 信息安全工程师 第 12 章网络安全审计技术原理与应用
  • Ungoogled Chromium127 编译指南 MacOS 篇(一)- 项目介绍
  • Formality:官方Tutorial(一)
  • JWT包中的源码分析【Golang】
  • 解决uniapp H5页面限制输入框只能输数字问题
  • protobuf: 通讯录2.1
  • 生成文本格式日历的Python程序
  • SwanLab x LLaMA Factory:国产开源AI训练工具组合拳(含教程)
  • 如何使用Python生成词云图:结合`wordcloud`、`imageio`、`collections`和`jieba`分词模块
  • Excel VBA 自动填充空白并合并相同值的解决方案
  • 1.计算机英语
  • Spring boot对接安全证书
  • 通过 4 种方法将数据从 OnePlus 传输到Android
  • JavaScript中的JSON是什么
  • 【我的 PWN 学习手札】IO_FILE 之 劫持vtable
  • 24.01.01 MyBatis
  • 1.梳理一下neo4j的安装的过程以及错误
  • 9.若依-自定义表单构建
  • MarkDown怎么转pdf;Mark Text怎么使用;
  • sublime text for mac 如何在一行末尾添加内容或符号
  • 用uniapp写一个播放视频首页页面代码
  • FFmpeg(音视频处理的瑞士军刀)开发实战指南
  • 论文笔记:DepthLab: From Partial to Complete