LeetCode/单词搜索
给定一个m x n二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用
1. 回溯法
类似于岛屿搜索的二维矩阵搜索,要用一个二维数组标记遍历过的路径,然后就是遍历每一个位置,递归四个方向
递归的时候注意矩阵边界以及该位置是否探索过
class Solution {
public:
bool flag = false;
void check(vector<vector<char>>& board, vector<vector<int>>& visited, int i, int j, string& s, int k) {
if(flag) return;
if (board[i][j] != s[k]) return;//判断对应值相等
if (k == s.length() - 1){flag=1;return;}//到达边界
visited[i][j] = true; //记录足迹
vector<pair<int, int>> directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
//做选择
for (const auto& dir: directions) {
int newi = i + dir.first, newj = j + dir.second;//递归四个方向
//越界条件
if (newi >= 0 && newi < board.size() && newj >= 0 && newj < board[0].size())
if (!visited[newi][newj]) //如果不在路径中
check(board, visited, newi, newj, s, k + 1);//递归下一位置
}
visited[i][j] = false;//撤销该位置选择
}
bool exist(vector<vector<char>>& board, string word) {
int h = board.size(), w = board[0].size();
vector<vector<int>> visited(h, vector<int>(w));//建立一个足迹表
//递归每一个位置
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++) {
if (flag) return true;//找到立马结束遍历
check(board, visited, i, j, word, 0);
}
return flag;
}
};