leetcode 79. 在二维网格内搜索单词

题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
leetcode 79. 在二维网格内搜索单词_第1张图片

解题思路

由于我们要在二维数组中寻找路径,所以我们可以采用递归的方式,如果当前路径不符合要求,我们进行回退,所以采用回溯法。

(1)我们首先遍历数组,确定一个路径开始的位置
(2)重写一个函数isExist,来判断重该位置board[i][j]开始走,是否能够找到一条路径
(3)isExist的实现:我们先判断当前位置是否在网格内,如果超出网格范围返回false;再判断当前位置的元素是否等于字符串对于位置元素;并且该位置是否被遍历过
(4)以上条件全都满足,说明可以访问该位置,将标志位置为1,并且继续递归遍历该节点的上下左右节点。
(5)如果上下左右节点有一条路径能够达到,则继续,返回true
(6)如果上下左右节点都不能够达到,则回退,将标志位置为0

代码

    public boolean exist(char[][] board, String word) {
     
    	System.out.println(word);
    	for (int i = 0; i < board.length; i++) {
     
			for (int j = 0; j < board[0].length; j++) {
     
				int[][] visited = new int[board.length][board[0].length];
				if(isExist(board,word,i,j,0,visited))
					return true;
					
			}
		}
    	return false;
    }
    
    public boolean isExist(char[][] board, String word,int i,int j,int index,int[][] visited) {
     
    	

    	
    	if(i<0||i>=board.length||j<0||j>=board[0].length)
    		return false;
    	
    	if(board[i][j]!=word.charAt(index) || visited[i][j]==1)
    		return false;
    	
    	if(index==word.length()-1)
    		return true;
    	
    	visited[i][j] = 1;
    	if( isExist(board, word, i-1, j, index+1, visited)||
    			isExist(board, word, i+1, j, index+1, visited) ||
    			isExist(board, word, i, j-1, index+1, visited) ||
    			isExist(board, word, i, j+1, index+1, visited))
    		
    		return true;
    	else
    		visited[i][j] = 0;
    	return false;
    	
    }

你可能感兴趣的:(算法刷题)