79. 单词搜索

这是一篇关于79. 单词搜索问题的博客,主要讲解如何在二维网格中通过深搜算法寻找按照字母顺序相邻的单元格构成的单词,强调了深搜的核心思想和实现步骤,包括遍历、方向判断和边界检查。
摘要由CSDN通过智能技术生成

79. 单词搜索 【中等题】【深搜】

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

题目讲解

【历史重难点题目】

【核心思想】

  • 深搜

【思路】

  • 遍历board[][]数组,找到与word第一个字母相同位置,这是深搜的起点
  • start存储word中要对比字母的序号,依次做+1操作
  • int[][] map={{1,0},{0,1},{-1,0},{0,-1}},表示下一个要遍历的方向
  • flag存储已经遍历过的结点
  • 遍历新的4个方向,若board[iNew][jNew]==words[start],则start++,并继续深搜
  • 若没有找到,则跳到第一步继续运行,直到找到为止

【备注】

  • 要注意判断当前是否超出board[][]的范围,即iNew>=0 && iNew<board.length && jNew>=0 && jNew<board[0].length

【代码】

public boolean exist(char[][] board, String word) {
    char[] words=word.toCharArray();
    boolean[][] flag=new boolean[board.length][board[0].length];
    for(int i=0;i<board.length;i++){
        for(int j=0;j<board[0].length;j++){
            if(board[i][j]==words[0]) {
                flag[i][j]=true;
                if(help(board,i,j,words,1,flag))
                    return true;
                flag[i][j]=false;
            }
        }
    }
    return false;
}

boolean help(char[][] board,int i,int j,char[] words,int start,boolean[][] flag){
    if(start>=words.length)
        return true;
    int[][] map={{1,0},{0,1},{-1,0},{0,-1}};
    for(int n=0;n<4;n++){
        int iNew=i+map[n][0];
        int jNew=j+map[n][1];

        if(iNew>=0 && iNew<board.length && jNew>=0 && jNew<board[0].length &&
                board[iNew][jNew]==words[start] && !flag[iNew][jNew]){
            flag[iNew][jNew]=true;
            if(help(board,iNew,jNew,words,start+1,flag))
                return true;
            flag[iNew][jNew]=false;
        }
    }
    return false;
}

【备注】

  • 帮到你了的话,点个在看吧

关注微信公众号“算法岗从零到无穷”,更多算法知识点告诉你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值