Quetion 79– Word Search
给定一个字符表和一个字符串,判断能否用相邻的字符连接起来形成该字符串。
算法
对每个表中的字符进行一遍DFS。在每次DFS的过程中,记录当前访问过的节点,以免重复访问。若能找到则返回true;否则返回false。
Code
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int nowpos = 0, rows = board.size(), cols = board[0].size(), wsize=word.size();
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){
vector<vector<bool>> passed(rows, vector<bool>(cols, false));
if(dfsrecurtive(board, i, j, rows, cols, nowpos, word, passed,wsize)==wsize) return true;
}
}
return false;
}
int dfsrecurtive(vector<vector<char>> &board, int row, int col, int rows, int cols, int nowpos,
string& word, vector<vector<bool>>& passed, int wsize){
if(board[row][col]!=word[nowpos]) return -1;
if(board[row][col]==word[nowpos]) nowpos++;
if(nowpos==wsize) return nowpos;
for(auto d: dr){
int newrow = row + d[0], newcol = col + d[1];
if(newrow<0||newrow>=rows||newcol<0||newcol>=cols||passed[newrow][newcol]) continue;
passed[row][col] = true;
if(dfsrecurtive(board, newrow, newcol, rows, cols, nowpos, word, passed,wsize)==wsize) return wsize;
passed[row][col] = false;
}
return -1;
}
private:
vector<vector<int>> dr{{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; //代表四个方向,左上右下
};