题解 | 单词搜索

单词搜索

https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board string字符串vector 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool vis[101][101] = {0};
    int m, n;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};

    bool exist(vector<string>& board, string word) 
    {
        m = board.size(), n = board[0].size();
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
                if(board[i][j] == word[0]) 
                    if(dfs(board, word, i, j, 0)) return true;
        return false;
    }

    bool dfs(vector<string>& board, string word, int i, int j, int pos)
    {
        if(pos == word.size() - 1) return true;

        vis[i][j] = true;
        for(int k = 0; k < 4; k++)
        {
            int a = i + dx[k], b = j + dy[k];
            if(a >= 0 && a < m && b >= 0 && b < n && !vis[a][b] && board[a][b] == word[pos + 1])
            {
                if(dfs(board, word, a, b, pos + 1)) return true;
            }
        }
        vis[i][j] = false;

        return false;
    }
};

核心思路:

1 遍历起点: 遍历二维网格中的每个单元格, 将其作为单词搜索的起点.

2 DFS 搜索: 从起点开始, 递归地向四个方向 (上, 下, 左, 右) 搜索下一个字符.

3 回溯机制: 使用 vis 数组标记已经访问的单元格, 避免重复访问; 回溯时撤销标记, 允许其他路径使用相同的单元格.

全部评论

相关推荐

06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
07-23 12:04
门头沟学院 Java
现在是很缺人吗
码农索隆:缺分母,不缺分子,这样好作为炫耀的资本
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务