[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;
    }
};

已发布

分类

,

来自

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注