题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。 例:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED” 输出:true
思路:要在一个二维数组中找一个字符串,找到返回true,找不到返回false。那么我们分情况来说:
- 如果二维数组board不存在,或者是board里边没有任何元素,这种情况肯定是匹配不了字符串的,返回false.
- 如果二维数组存在并有元素,我们从[0][0]这个位置开始遍历board,如果把board上所有的元素都遍历完了,还是没找到就返回false.
- 对于board[i][j]进行深度遍历,如果board[i][j]!=word[cur],说明这个位置上的元素不匹配当前的字符,就不用往这个元素的相邻元素再看了,返回false就行了;如果board[i][j]==word[cur],我们把当前的标志位设为1(表示已访问),我们往这个元素的上下左右的元素看看,看看匹不匹配word[cur+1]这个字符,然后重复本条情况,一直往下找,直到找到word最后一个字符完为止,此时返回true.
var exist = function(board, word) {
if(board==null||board.length==0||board[0].length==0){
return false;
}
var flag=new Array();
var tuple=board[0];
for(var i=0;i<board.length;i++){
flag[i]=new Array();
for(var j=0;j<tuple.length;j++){
flag[i][j]=0;
}
}
var cur=0;
for(i=0;i<board.length;i++){
for(j=0;j<tuple.length;j++){
if(dfs(board,flag,i,j,word,0)){
return true;
}
}
}
return false;
};
function dfs(board,flag,i,j,word,cur){
if(i<0||i>=board.length||j<0||j>=board[0].length||board[i][j]!=word[cur]||flag[i][j]==1){
return false;
}
if(cur==word.length-1){
return true;
}
flag[i][j]=1;
var temp=false;
temp=(dfs(board,flag,i+1,j,word,cur+1)||dfs(board,flag,i-1,j,word,cur+1)||dfs(board,flag,i,j+1,word,cur+1)||dfs(board,flag,i,j-1,word,cur+1));
flag[i][j]=0;
return temp;
}
总结:这道题用了深度遍历及回溯法的思想。
|