Java 题解 | #童谣寻找问题#
童谣寻找问题
https://www.nowcoder.com/practice/2537c84de0034d019b1679cf7bfcf776
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param board char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
boolean flag = false;
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == word.charAt(0)) {
int[][] vis = new int[m][n];
dfs(board, vis, word, 0, i, j);
if (flag) {
return flag;
}
}
}
}
return false;
}
private void dfs(char[][] board, int[][] vis, String word, int index, int i,
int j) {
if (flag) {
return;
}
if (index == word.length()) {
flag = true;
return;
}
int m = board.length;
int n = board[0].length;
if (i < 0 || i >= m || j < 0 || j >= n || vis[i][j] == 1 ||
board[i][j] != word.charAt(index)) {
return;
}
vis[i][j] = 1;
dfs(board, vis, word, index + 1, i + 1, j);
dfs(board, vis, word, index + 1, i - 1, j);
dfs(board, vis, word, index + 1, i, j + 1);
dfs(board, vis, word, index + 1, i, j - 1);
vis[i][j] = 0;
}
}
编程语言是Java。
该题考察的知识点包括:
- 二维数组的遍历
- 递归(深度优先搜索)
- 条件判断和逻辑控制
代码的文字解释如下:
- 编写一个
exist方法,接受一个字符类型的二维数组board和一个字符串类型的单词word作为参数,并返回一个布尔值。 - 在
exist方法中,获取二维数组board的行数和列数,分别赋值给变量m和n。 - 使用两层循环遍历二维数组
board,通过比较当前元素与目标单词的首字母是否相等来确定起始位置。 - 如果找到起始位置,就创建一个与二维数组
board同样大小的二维数组vis,用于标记访问过的元素。 - 调用递归函数
dfs,传入二维数组board、vis、目标单词word、当前字符下标0、起始位置的行索引i和列索引j。 - 如果在递归过程中找到了目标单词,则将
flag设置为true,并立即返回。 - 在递归函数
dfs中,首先判断是否已经找到了目标单词(flag为true),如果是,则直接返回。 - 判断递归终止条件,即当前字符下标是否等于目标单词的长度。若相等,则说明已经找到了目标单词,将
flag设置为true,并立即返回。 - 判断越界情况,如果当前位置超出了二维数组范围、或者当前位置已经被访问过、或者当前位置的字符与目标单词中对应位置的字符不相等,则返回。
- 将当前位置标记为已访问,即将
vis[i][j]设置为1。 - 调用递归函数
dfs,分别向四个方向上进行搜索,即向右移动一列、向左移动一列、向下移动一行、向上移动一行,并将当前字符下标加1。 - 当递归函数返回后,将当前位置的访问状态重置为未访问,即将
vis[i][j]设置为0。 - 返回
flag的值,即是否找到了目标单词。

