79. 单词搜索

文章目录

题目

回溯:79. 单词搜索

给定一个 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 仅由大小写英文字母组成

代码

cpp 复制代码
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int rows=board.size();// 网格行数
        int cols=board[0].size();// 网格列数
        vector<vector<bool>> visit(rows,vector<bool>(cols,false));
        for(int row=0;row<rows;row++){
            for(int col=0;col<cols;col++){
                if(dfs(board,word,row,col,0,visit)){
                    return true;
                }
            }
        }
        return false;
    }

    bool dfs(vector<vector<char>>& board, string word,int row,int col,int index,vector<vector<bool>>& visit){
        if(index==word.length()){
            return true;
        }
        int rows=board.size();
        int cols=board[0].size();
        if(row>=rows||row<0||col>=cols||col<0// 越界
        ||board[row][col]!=word[index]// 字符不匹配
        ||visit[row][col]){ // 已经走过
            return false;
        }
        visit[row][col]=true;//防止递归时回头走重复格子。
        bool res=false;
        res|=dfs(board,word,row+1,col,index+1,visit);//下
        res|=dfs(board,word,row,col+1,index+1,visit);//右
        res|=dfs(board,word,row-1,col,index+1,visit);//上
        res|=dfs(board,word,row,col-1,index+1,visit);//左
        visit[row][col]=false;
        return res;
    }
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

方法:使用DFS来穷举所有的解

边界条件:如果当前字符串下标等于字符串的长度

代码原理:

遍历网格里每一个格子作为起点

从起点开始,上下左右四个方向递归搜索

每走一步:

标记当前格子已访问(防止回头重复走)

继续往下匹配下一个字符

匹配失败就撤销标记(回溯),退回上一步

只要有一条路径匹配完整个单词,就返回 true

相关推荐
catchadmin7 分钟前
使用 PHP TrueAsync 改造 Laravel 协程异步化的可行路径
开发语言·php·laravel
wbs_scy13 分钟前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
郑州光合科技余经理1 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
南子北游2 小时前
Python学习(基础语法1)
开发语言·python·学习
张健11564096482 小时前
使用信号量限制并发数量
开发语言·c++
jc06203 小时前
6.1云原生之Docker
c++·docker·云原生
糯米团子7493 小时前
Web Worker
开发语言·前端·javascript
我命由我123453 小时前
JavaScript 开发 - 获取函数名称、获取函数参数数量、获取函数参数名称
开发语言·前端·javascript·css·html·html5·js
白晨并不是很能熬夜4 小时前
【PRC】第 2 篇:Netty 通信层 — NIO 模型 + 自定义协议 + 心跳
java·开发语言·后端·面试·rpc·php·nio