LeetCode - word-search

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toward_south/article/details/89510494

题目:

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

For example,
Given board =

[
  ["ABCE"],
  ["SFCS"],
  ["ADEE"]
]

word ="ABCCED", -> returnstrue,
word ="SEE", -> returnstrue,
word ="ABCB", -> returnsfalse.

题意:

给定一个2D板和一个单词,找出这个单词是否存在于网格中。

单词可以由顺序相邻的单元格组成,其中“相邻”单元格是水平或垂直相邻的单元格。同一信元不可使用超过一次。

解题思路:

仔细一看,这不就是一个图嘛,对于找出这个单词是否存在网格中,那不是典型的DFS应用。

从某一个元素出发,然后DFS下自身上下左右,是否能找到word的字符串。这里需要一个辅助数组visited(与board同大小),用来判断当前元素是否已经被访问过。index来记录word已经查找到第几个字符了,i,j是当前字符的位置

这里需要注意的是,每次从新的字符出发时,需要重置visited的标记,刚开始设为true,每当找到res就设置为false

还有就是边界的确定,

1.当index == word.length,返回true

2.确认i,j是否越界;当visited == false;还有就是当前字符不等于word中下标为index的字符时,这时候都需要终结递归

下面是Java代码实现:

public static  boolean exist(char[][] board, String word) {
	    if(word == null || word.length() <=0) {
        	return true;
        }
        if(board == null || board.length <= 0 || board[0].length <= 0 ) {
        	return false;
        }
 
        boolean[][] visited = new boolean[board.length][board[0].length];
        
        for(int i = 0; i < board.length;i++) {
        	for(int j = 0; j < board[0].length;j++) {
        		if(dfs(board, word, 0, i, j, visited)) {
        			return true;
        		}
        	}
        }
        
		return false;
    }
	
	public static boolean dfs(char[][] board, String word, int index,int i, int j,  boolean[][] visited) {
		if(index == word.length()) {
			return true;
		}
		
		if(i < 0 || j < 0|| i >= board.length || j >= board[0].length || visited[i][j] || board[i][j] != word.charAt(index)) {
			return false;
		}
		
		visited[i][j] = true;
		
		boolean res = dfs(board, word, index+1, i-1, j, visited) ||
				dfs(board, word, index+1, i+1, j, visited)||
				dfs(board, word, index+1, i, j+1, visited)||
				dfs(board, word, index+1, i, j-1, visited);
		visited[i][j] = false;
		
		return res;
	}

猜你喜欢

转载自blog.csdn.net/toward_south/article/details/89510494