ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode-79. 单词搜索

2022-02-03 22:01:52  阅读:214  来源: 互联网

标签:word && isTravel 单词 board dx dy LeetCode 79


题目来源

79. 单词搜索

题目详情

给定一个 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
  • boardword 仅由大小写英文字母组成

进阶: 你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

题解分析

  1. 本题很明显是深搜加回溯的题型,可以说这是一道回溯的模板题。
  2. 这个题目虽然很简单,但是在编码时也会有一些细节问题,比如需要设置isTravel矩阵来标识一个坐标是否被遍历过。而且为了避免以后的轮次中重复赋初始值,需要在回溯时将isTravel重新设置为false。
  3. 考虑到符合条件的单词可以从任意一个单元开始出发组成,所以需要遍历所有的矩阵单元。
class Solution {
    int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    boolean flag = false;
    boolean[][] isTravel;
    int n, m;
    public boolean exist(char[][] board, String word) {
        n = board.length;
        m = board[0].length;
        isTravel = new boolean[n][m];

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                char ch = board[i][j];
                if(ch == word.charAt(0)){
                    isTravel[i][j] = true;
                    dfs(board, word, 0, i, j);
                    isTravel[i][j] = false;
                    if(flag){
                        return true;
                    }
                }
            }
        }

        return false;
    }

    private void dfs(char[][] board, String word, int pos, int x, int y){
        if(flag){
            return;
        }
        if(pos == word.length() - 1){
            flag = true;
            return;
        }
        for(int i=0; i<4; i++){
            int dx = x + dir[i][0];
            int dy = y + dir[i][1];
            if(dx >=0 && dx < n && dy >=0 && dy < m && !isTravel[dx][dy] && word.charAt(pos + 1) == board[dx][dy]){
                isTravel[dx][dy] = true;
                dfs(board, word, pos + 1, dx, dy);
                isTravel[dx][dy] = false;
            }
        }
    }
}

结果展示

image

标签:word,&&,isTravel,单词,board,dx,dy,LeetCode,79
来源: https://www.cnblogs.com/GarrettWale/p/15862116.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有