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