79.单词搜索
🏳️🌈 79.单词搜索
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路
基本思想
为了从board中找到给定的单词,需要在board中搜索,只要找到一条完整的路径,且路径中的元素只被使用一次,那么就相当于找到了单词,对于这条路径来说,不一定非要一直向着一个方向,所以当处于一个节点时,可以向上下左右四个方向移动,所以这种搜索有点像图论中的岛屿问题,所以可以依次从board中的每一个位置出发,尝试搜索出一条合法的路径
对于board中的每一个位置来说,当当前位置无法与word中的元素匹配,那么就没有从这个位置出发的必要,直接返回false,当当前元素与word中的元素匹配,才可以进行下面的匹配
由于每一步的移动的前提是当前位置与word中的元素匹配,当当前元素匹配到了word中的最后一个位置的元素时,说明已经找到了一条路径,这条路径形成了word,此时可以逐层向上返回true,整个程序这里是递归返回点
当没有到达递归返回点,且当前位置匹配word中的元素时,需要从当前位置出发,向上下左右开始搜索,尝试找到下一个匹配的位置,找到了继续向下,没找到就返回false
总结整体的流程就是依次从board中的每一个元素出发,尝试找到形成word的一条路径,形成一个图的搜索形式,出现一个匹配的位置,就从这个位置继续向下匹配
执行流程
- 依次从board中的每一个元素出发进行搜索,形成一个图的搜索形式
- 当前元素与word的位置不匹配,直接返回false
- 当前元素与word的位置匹配,且匹配到了最后一个元素,直接返回true,递归从这里开始向上逐层返回true
- 当前元素与word的位置匹配,但是没到最后一个元素,此时需从当前元素出发,向上下左右遍历那些没访问过的元素,四个方向只要有一个方向匹配成功,就会继续向下匹配,如果没有一个位置匹配成功,此时就会逐层返回false,最终整个方法返回false,程序会继续选择board的下一个元素进行搜索,重复1的步骤
代码
根据以上分析,得出以下代码:
|
|
总结
可以将搜索过程看做是一个图论中的岛屿问题,从一个点出发,向上下左右搜索,尝试找到形成word的路径,当前点找不到,继续从board中的下一个点开始找,直到board中所有的点都搜索过都没找到,此时返回false,但是只要有一个点能找到就一定会返回true