给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false
使用回溯的方法
#include
#include
using namespace std;
class Solution {
public:
bool check(vector<vector<char>>& board, vector<vector<int>>& visited, int i, int j, string& s, int k) {
// 检查当前坐标的字母是否与目标单词中的对应字母相等
if (board[i][j] != s[k]) {
return false;
}
// 如果已经匹配到目标单词的最后一个字母,表示找到了路径,返回true
else if (k == s.length() - 1) {
return true;
}
visited[i][j] = true; // 将当前坐标标记为已访问
vector<pair<int, int>> directions{ {0, 1}, {0, -1}, {1, 0}, {-1, 0} }; // 上、下、左、右四个方向
bool result = false; // 用于记录是否找到路径
// 依次遍历四个方向
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]) {//用于检查位置(newi, newj)是否已经被访问过
// 递归调用check函数进行下一步的搜索
bool flag = check(board, visited, newi, newj, s, k + 1);
if (flag) {
result = true; // 如果找到路径,直接返回true
break;
}
}
}
}
visited[i][j] = false; // 撤销对当前坐标的标记
return result;
}
bool exist(vector<vector<char>>& board, string word) {
int h = board.size(), w = board[0].size(); // 矩阵的行数和列数
vector<vector<int>> visited(h, vector<int>(w)); // 记录每个格子的访问状态
// 遍历矩阵的每个格子,对每个格子调用check函数
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
bool flag = check(board, visited, i, j, word, 0); // 调用check函数进行搜索
if (flag) {
return true; // 如果找到路径,直接返回true
}
}
}
return false; // 遍历结束后仍未找到路径,返回false
}
};
int main() {
// 示例用法
vector<vector<char>> board = {
{'A', 'B', 'C', 'E'},
{'S', 'F', 'C', 'S'},
{'A', 'D', 'E', 'E'}
};
Solution s;
string word = "ABCCED";
if (s.exist(board, word)) {
cout << "Word exists in the board." << endl;
}
else {
cout << "Word does not exist in the board." << endl;
}
return 0;
}
Word exists in the board.
整体的思路是使用深度优先搜索(DFS)算法在矩阵中搜索是否存在与目标单词匹配的路径。