LeetCode(cai鸟之路)79 单词搜索
题目描述
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED” 输出:true 输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE” 输出:true 输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB” 输出:false
代码:
class Solution { public static boolean exist(char[][] board, String word) { //设置一个访问数组,为1时说明已经遍历过 int[][] visited = new int[board.length][board[0].length]; for (int i = 0;i<board.length;i++){ for (int j = 0;j<board[i].length;j++){ //如果匹配到第一个字母进入递归 // System.out.println(i+" "+j+" "+board[i][j]); if (board[i][j] == word.charAt(0)){ visited[i][j] = 0; if (dfs(board,visited,0,i,j,word)){ return true; }else { continue; } } } } return false; } public static boolean dfs(char[][] board,int[][] visited,int index,int i,int j,String word){ //首先声明边界条件,超出边界了直接返回false if (i<0||i>=board.length||j<0||j>=board[0].length || board[i][j] != word.charAt(index)){ return false; } if (index == word.length()-1){ return true; }else { char temp = board[i][j]; board[i][j] = *; boolean isFind = dfs(board,visited,index+1,i-1,j,word)||dfs(board,visited,index+1,i,j+1,word) ||dfs(board,visited,index+1,i+1,j,word)||dfs(board,visited,index+1,i,j-1,word); board[i][j] = temp; return isFind; } } }
分析
通过读题,很容易知道这题时通过递归遍历去求解问题,那从哪开始递归呢,我们其实不需要从二维数组的第一个元素诶个进行dfs,我们只需要先遍历二维数组,找到和给定的word中第一个字母相同的元素,从这个位置开始进行深度遍历与递归,深度遍历需要对找到的这个元素的四个方位进行递归求解,如果当前递归函数指向与word中的元素相同,就返回true,当前递归肯定要有结束的条件。 本题中的条件有两个,一个就是是否数组越界,是否相等;还有就是是否已经全部找到了,如果分别满足条件就返回,结束当前的递归过程。
上一篇:
IDEA上Java项目控制台中文乱码