剑指Offer12|LeetCode79.矩阵中的路径
时间:2021-08-02
本文章向大家介绍剑指Offer12|LeetCode79.矩阵中的路径,主要包括剑指Offer12|LeetCode79.矩阵中的路径使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
给定一个 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 仅由大小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题方法
DFS回溯
1.双重循环找到字符串的起点
2.基于起点上下左右四个方向找剩余路径
3.在找的过程中判断选择是否正确,是否越界,是否已访问过
4.声明一个变量保存访问过的元素
5.如果递归下一个节点时错误的,说明当前选择也是错误的,需要把当前元素的是否访问状态改回未访问
时间复杂度O(MN*3^L) M,N为网格的长宽 L为字符串长度 每次递归除了第一次可以进入4个分支,
其余最多进入3个分支,因为每个位置只能一次,走过无法再访问。
空间复杂度O(MN) 开辟存储是否访问过的数组
如果采用修改原数组的方法 空间复杂度O(1)
代码
// dfs + 辅助数组
func exist(board [][]byte, word string) bool {
m,n := len(board),len(board[0])
// 访问记录
visited := make([][]bool,m)
for i := 0;i < m;i++{
visited[i] = make([]bool,n)
}
var canFind func(r,c,i int) bool
canFind = func(r, c, i int) bool {
// 已经找到复合字符串长度的路径
if i == len(word){
return true
}
// 索引越界
if r < 0 || r >= m || c < 0 || c >= n{
return false
}
// 当前元素已访问过或者当前元素不等于当前需要找的字符
if visited[r][c] || board[r][c] != word[i] {
return false
}
// 设置当前元素为已访问状态
visited[r][c] = true
// 递归剩余路径 在 || 判断中,只要有符合的便不会继续执行后面的判断,达到剪枝的目的
if canFind(r+1,c,i+1) || canFind(r-1,c,i+1) || canFind(r,c+1,i+1) || canFind(r,c-1,i+1){
return true
}
// 没有符合的路径 将当前元素访问状态回退
visited[r][c] = false
return false
}
for i := 0;i < m;i++ {
for j := 0;j < n;j++{
if board[i][j] == word[0] && canFind(i,j,0){
return true
}
}
}
return false
}
// dfs + 直接修改原数组
func exist2(board [][]byte, word string) bool {
m,n := len(board),len(board[0])
var canFind func(r,c,i int) bool
canFind = func(r, c, i int) bool {
// 已经找到复合字符串长度的路径
if i == len(word){
return true
}
// 索引越界
if r < 0 || r >= m || c < 0 || c >= n{
return false
}
// 如果当前元素不等于寻找元素
if board[r][c] != word[i] {
return false
}
// 修改元素,表示已访问
temp := board[r][c]
board[r][c] = ' '
// 递归剩余路径 在 || 判断中,只要有符合的便不会继续执行后面的判断,达到剪枝的目的
if canFind(r+1,c,i+1) || canFind(r-1,c,i+1) || canFind(r,c+1,i+1) || canFind(r,c-1,i+1){
return true
}
// 没有符合的路径 将当前元素回退
board[r][c] = temp
return false
}
for i := 0;i < m;i++ {
for j := 0;j < n;j++{
if board[i][j] == word[0] && canFind(i,j,0){
return true
}
}
}
return false
}
原文地址:https://www.cnblogs.com/hzpeng/p/15090900.html
- 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL
- 10x Python开发者必读:本月Python文章TOP 10
- Linux下更换默认yum源为网易yum源的操作记录
- yum源使用的几个报错小总结
- JQuery笔记(一)
- Haproxy和Nginx负载均衡测试效果对比记录
- JQuery笔记(三) jquery的用途
- Heartbeat使用梳理
- JQuery笔记(二) animate支持的属性
- 腾讯叮当首次系统性展示AI能力 开放日展示实战型解决方案
- Execute 方法(Find 对象)
- 在容器中部署mysql与数据持久化
- silverlight如何在运行时用代码动态控制(或创建)动画
- 小程序深夜连发4大功能!你们要的直播来了!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7将Nginx添加系统服务的方法步骤
- linux ss命令详解
- 如何在Linux中设置快捷方式图标
- foreman ubuntu16 快速安装
- Three.js教程(2):工具篇
- Linux系统多网卡环境下的路由配置详解
- 前端3D文字效果
- Bash中尖括号的更多使用方法
- linux mpstat命令使用详解
- CentOS7安装调试Mysql数据库的步骤详解【实例】
- 深入理解Bash中的尖括号(适合初学者)
- linux安装php7的方法详解
- centos7.2搭建nginx的web服务器部署uniapp项目
- 通过 SSH 在远程 Linux 系统上运行命令的方法
- 详解Linux Namespace之User