给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
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
思路
递归改非递归是真的难。。。
#define PII pair<int, int>
class Solution {
public:
bool dfs(vector<vector<char>> &board, string &word){
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
bool st[210][210];
vector<PII> stk;
vector<int> idx;
int m = board.size(), n = board[0].size();
for(int i = 0; i < m; i ++)
for(int j = 0; j < n; j ++){
if(board[i][j] == word[0]){
memset(st, 0, sizeof st);
stk.clear(), idx.clear();
stk.push_back({i, j});
st[i][j] = 1;
int s = 0;
while(stk.size()){
if(stk.size() == word.size()) return 1;
auto t = stk.back();
int x = t.first, y = t.second;
int flag = 0;
for(int i = s; i < 4; i ++){
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= m || b < 0 || b >= n) continue;
if(st[a][b] || board[a][b] != word[stk.size()]) continue;
s = 0;
flag = 1;
st[a][b] = 1;
idx.push_back(i + 1);
stk.push_back({a, b});
break;
}
if(!flag){
st[x][y] = 0;
stk.pop_back();
if(idx.size()){
s = idx.back();
idx.pop_back();
}
}
}
}
}
return 0;
}
bool exist(vector<vector<char>>& board, string word) {
return dfs(board, word);
}
};