二维数组查找单词

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

提示:

board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

解题思路:
首先在数组中找到单词的开头字符,
判断该字符的上下左右位是否有下一位的字符
基于其中一种选择,判断下一位字符的上下左右位是否有下下位字符。。。
故要用到递归

var exist = function(board, word) {
		var cols = board.length;//数组行数
		var rows = board[0].length;//数字列数
		var flag = false;
		var tag = new Array(cols);//用于记录数组元素是否被访问过 避免重复访问
		for(var i = 0;i < cols;i++){
			tag[i] = new Array(rows);
		}

		for(var i = 0;i < cols;i++){
			for(var j = 0;j < rows;j++){
				if(board[i][j] == word.charAt(0)){
					if(canFind(i,j,0)){
						return true;
					}
				}
			}
		}
		function canFind(col,row,i){//递归查找函数
			if(i > word.length - 1){
				return true;
			}
			if(row < 0||row >= rows || col < 0|| col >= cols || tag[col][row] == 1){
				return false;
			}
			if(i > 0 && board[col][row] != word.charAt(i)){
				return false;
			}
			tag[col][row] = 1; //标记该位置元素被访问过

			var canFindRest = 
			canFind(col + 1, row ,i + 1)||
			canFind(col - 1, row ,i + 1)||
			canFind(col, row + 1,i + 1)||
			canFind(col, row - 1,i + 1);
			if(!canFindRest){
				tag[col][row] = 0;
			}
			return canFindRest; //取消标记

		}
		return false;
};
var board = 
[
   ['a','b','c','e'],
   ['s','f','c','s'],
   ['a','d','e','e']
]
var word = 'ses';
console.log(exist(board,word))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值