【LeetCode】79-单词搜索
题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中 “相邻” 单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[['A','B','C','E'],['S','F','C','S'],['A','D','E','E']
]给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解题思路
回溯法
首先,需要一个辅助方法
boolean backtrack (int i, int j, int index, char[][] board, String word)
其中
char[][] board
和String word
就是题目给定的二维网格和单词int i
和int j
是索引,表示从char[][] board
中取出的元素int index
是索引,表示String word
的字符
该回溯算法的辅助方法流程如下:
- 如果当前字符串索引
index == word.length()
,表示有word.length()
次匹配都成功了,直接返回true
- 如果当前二维面板的索引超出有意义的范围或当前考察的二维面板的值和当前字符串的值不匹配,则返回
false
,结束这次搜索 - 将当前二维面板的值取出来暂存,为后面回溯做准备
- 用一个符号
*
表示这个元素已经使用过了,下次搜索就不能考虑它了(满足题目不能重复的要求) - (递归地)搜索当前元素周围的元素,看能否继续匹配,直到得到一个结果
- 将当前元素从
*
还原为以前的字符
最后,遍历整个二维面板,对每一个匹配到word.charAt(0)
的元素进行一次搜索,返回结果。
Java 实现
public boolean exist (char[][] board, String word) {for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] == word.charAt(0)) {if (backtrack(i, j, 0, board, word)) {return true;}}}}return false;
}private boolean backtrack (int i, int j, int index, char[][] board, String word) {if (word.length() == index) return true;if (i < 0 || i >= board.length ||j < 0 || j >= board[0].length ||board[i][j] != word.charAt(index))return false;char c = board[i][j];board[i][j] = '*'; // 标记,表示已使用过,不能再重复boolean ans;ans = backtrack(i + 1, j, index + 1, board, word)|| backtrack(i - 1, j, index + 1, board, word)|| backtrack(i, j + 1, index + 1, board, word)|| backtrack(i, j - 1, index + 1, board, word);board[i][j] = c; // 用完之后还要换回来,方便别的元素使用return ans;
}
心得体会
这一题的搜索思想和深度优先搜索(DFS)有点类似,回溯算法体现在,搜索完成后,要把当前二维面板的元素置换回来,方便下次搜索中使用。
转载于:https://www.cnblogs.com/yuzhenzero/p/10317090.html
【LeetCode】79-单词搜索相关推荐
- Leetcode 79. 单词搜索
Leetcode 79. 单词搜索 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/word-search/ 本质上 ...
- LeetCode 79 单词搜索
LeetCode 79 单词搜索 题目链接 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水 ...
- Leetcode 79.单词搜索
Time: 20190901 Type: Medium 题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&q ...
- java实现英文文件单词搜索系统_Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- LeetCode 79. 单词搜索【c++/java详细题解】
目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个 m x n 二维字符网格 board和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则, ...
- LeetCode 79. 单词搜索 | Python
文章目录 79. 单词搜索 题目 解题思路 代码实现 实现结果 总结 79. 单词搜索 题目来源:https://leetcode-cn.com/problems/word-search 题目 给定一 ...
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- LeetCode - #79 单词搜索(Top 100)
前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,<iOS 面试之道>作者,ACE 职业健身教练.)的 Swift 算法题题解整理为文字版 ...
- LeetCode 79. 单词搜索(回溯DFS)
1. 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个 ...
最新文章
- 电信业务支撑报表开发工具解决方案
- r 字符串转化为数值_Lua 字符串处理
- iphone开发中的一些小技
- graphql java demo_GraphQL学习,Java简单实现
- 【SpringCloud】Ribbon 负载均衡
- 教育行业oa软件怎么样?
- python 公开课_python公开课|可以用Python做的十件事,刚开始学python,你一定要知道...
- 手把手教你使用wordpress搭建个人网站
- typescript全局安装卸载以及npm相关问题
- 业务范围(business area)
- EBS 打印机设置——PASTA
- Python_Task01:变量、运算符、数据类型及位运算
- PHP:简单数学勾股定理
- MODIFY TRANSPORTING
- Python复习边边角角 (四)运算符
- python close_wait_服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
- 用python打开文件夹的三种方式
- Github Star 7.2K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
- AS3代码播放GIF动画
- 什么是WAP?(转)
热门文章
- Linux的首次登录操作总结
- mongodb 持久化 mysql_最详细的python爬虫指南(四):持久化操作(mongoDB、mysql)...
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
- Java 7 对ArrayList和HashMap的性能的提升
- AUCAD自定义[2006.9.22]
- devops 解决方案_DevOps是值得投资的职业倦怠解决方案
- alan turing_深入探讨Alan Turing的生活和遗产:5本及更多书籍
- 苹果和linux_苹果发布ResearchKit,Linux采用冲突代码,等等
- JavaScript css3模拟简单的视频弹幕功能
- Bootstrap进度条的颜色