题目:
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
解法一:深度优先遍历
class Solution {
public boolean exist(char[][] board, String word) {
/**深度优先遍历 */
char[] words = word.toCharArray();
for(int i=0; i<board.length; i++){
for(int j=0; j<board[0].length; j++){
if(search(board, words, i, j, 0)){
return true;
}
}
}
return false;
}
boolean search(char[][] board, char[] words, int i, int j, int index){
if(i>=board.length || i<0
|| j>=board[0].length || j<0
|| board[i][j] != words[index]){
return false; //当前访问越界或与words不匹配
}
if(index == words.length-1){
return true; //出口:words已经遍历完
}
board[i][j]='0'; //此时已经匹配上,则用0表示已访问
boolean res = search(board, words, i+1, j, index+1)
|| search(board, words, i-1, j, index+1)
|| search(board, words, i, j+1, index+1)
|| search(board, words, i, j-1, index+1);
board[i][j] = words[index]; //恢复
return res;
}
}
笔记:
(1)深度优先遍历,上下左右四个方向。对矩阵中每个元素都进行查找。
(2)递归出口:false:访问越界或不匹配
true:已经遍历到字符串最后一位
注意在深度优先遍历结束之后恢复原矩阵
(3)出现错误:
1)exist和search是俩函数,混一起写的时候括号弄丢了
2)search参数char[][] board的类型一开始顺手写成ch
3)因为true递归出口一开始写成 index == words.length,导致i和j越界,出现错误“……index is out of bounds for……”
(4)
char[] toCharArray() | 将String转换为新的char[]字符数组 | String toString() |
|| 逻辑或:有一个为真时为真,前面有一个为true则不再执行后面判断 | &&逻辑与:都为真时为真,前面有一个为false则不再执行后面判断 | !逻辑非:真假互换 |
| 按位或:全为false计算结果为false | &按位与:全为true计算结果为true |