2023年11月19日

[Leetcode] 单词搜索


给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

**输入:**board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED” **输出:**true

示例 2:

**输入:**board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE” **输出:**true

示例 3:

**输入:**board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB” **输出:**false

提示:

  • m == board.length

  • n = board[i].length

  • 1 <= m, n <= 6

  • 1 <= word.length <= 15

  • board 和 word 仅由大小写英文字母组成

class Solution {
private:
// A
// A
// A
// AS
// AB
//
bool dfs(vector<vector<char>>& board, int m, int n, int index, const string &word)
{
if (m < 0 || n < 0 || m > board.size() - 1 || n > board[0].size()-1 || word[index] != board[m][n])
return false;
if (index + 1 == word.size())
{
return true;
}
// std::cout << m << "," << n << std::endl;
// std::cout << cur_res << std::endl;
// std::cout << board[m][n] << std::endl;
board[m][n] = '\0';
if (dfs(board, m - 1, n, index + 1, word)||
dfs(board, m, n - 1, index + 1, word)||
dfs(board, m + 1, n, index + 1, word)||
dfs(board, m, n + 1, index + 1, word))
return true;
board[m][n] = word[index];
return false;
}
public:
bool exist(vector<vector<char>>& board, string word) {
for (auto i = 0; i < board.size(); ++i)
{
for (auto j = 0 ; j < board[0].size(); ++j)
{
if(dfs(board, i, j, 0, word))
return true;
}
}
return false;
}
};