给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
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
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/word-search 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
回溯法,尽量提前截止dfs,且限制进入dfs的条件
class Solution {
public:
bool exist(vector
<vector
<char>>& board
, string word
) {
if(word
.size() == 0)return true;
vector
<vector
<bool>> visited(board
.size(),vector
<bool>(board
[0].size(),false));
for(int i
=0;i
<board
.size();i
++){
for(int j
=0;j
<board
[0].size();j
++){
if(board
[i
][j
] == word
[0]){
if(dfs(board
,visited
,word
,0,i
,j
))
return true;
}
}
}
return false;
}
bool dfs(vector
<vector
<char>>& board
,vector
<vector
<bool>>& visited
,string
& word
,int index
,int i
,int j
){
if(index
== word
.size()-1)
return board
[i
][j
] == word
[index
];
visited
[i
][j
] = true;
bool up
,down
,left
,right
;
up
= down
= left
= right
= false;
if(i
>= 1 && !visited
[i
-1][j
] && board
[i
-1][j
] == word
[index
+1])
up
= dfs(board
,visited
,word
,index
+1,i
-1,j
);
if(up
) return true;
if(j
>= 1 && !visited
[i
][j
-1] && board
[i
][j
-1] == word
[index
+1])
left
= dfs(board
,visited
,word
,index
+1,i
,j
-1);
if(left
) return left
;
if(i
< board
.size()-1 && !visited
[i
+1][j
] && board
[i
+1][j
] == word
[index
+1])
down
= dfs(board
,visited
,word
,index
+1,i
+1,j
);
if(down
)return down
;
if(j
< board
[0].size()-1 && !visited
[i
][j
+1] && board
[i
][j
+1] == word
[index
+1])
right
= dfs(board
,visited
,word
,index
+1,i
,j
+1);
if(right
)return true;
visited
[i
][j
] = false;
return false;
}
};