剑指 Offer 12. 矩阵中的路径
2021.7.5
一些细节值得学习:
- 不使用visited数组,直接将访问使用的格子对应的字母改成了一个不可用的“\0”;
- 不使用direction数组,直接四个方向的布尔值结果或起来;
- 将单词第一个字母的搜索也纳入迭代。
我的代码
class Solution {
public:
bool find(vector<vector<char>>& board, vector<vector<bool>>& visited, string word, int pos, int i, int j){
if(pos == word.length())return true;
for(int a=0;a<direction.size();a++){
int i2 = i+direction[a][0];
int j2 = j+direction[a][1];
if(i2>=0&&i2<board.size()&&j2>=0&&j2<board[0].size()){
if(board[i2][j2]==word[pos]&&visited[i2][j2]==false){
visited[i2][j2] = true;
if(find(board, visited, word, pos+1, i2, j2))return true;
visited[i2][j2] = false;
}
}
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
if(word.length() == 0) return false;
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]){
visited[i][j] = true;
if(find(board, visited, word, 1, i, j))return true;
visited[i][j] = false;
}
}
}
return false;
}
private:
vector<vector<int>> direction{{0,1}, {0,-1}, {1,0}, {-1,0}};
};
优化后的代码
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
rows = board.size();
cols = board[0].size();
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(dfs(board, word, i, j, 0)) return true;
}
}
return false;
}
private:
int rows, cols;
bool dfs(vector<vector<char>>& board, string word, int i, int j, int k) {
if(i >= rows || i < 0 || j >= cols || j < 0 || board[i][j] != word[k]) return false;
if(k == word.size() - 1) return true;
board[i][j] = '\0';
bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
board[i][j] = word[k];
return res;
}
};