LeetCode - word-search

题目:

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;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值