力扣LeetCode #79 单词搜索(Exist)

- 题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

- 示例

  • 示例:
    board =
    [
    [‘A’,‘B’,‘C’,‘E’],
    [‘S’,‘F’,‘C’,‘S’],
    [‘A’,‘D’,‘E’,‘E’]
    ]

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

- 思路分析

深度优先搜索。找到一个符合的字符,就依次检查上下左右的元素是否也符合。

- JAVA实现

class Solution {
    public boolean exist(char[][] board, String word) {
        int rows = board.length;
        int columns = board[0].length;
        boolean find = false;
        int[][] used = new int[rows][columns];   //判断这个位子是否已经用过了
        for(int i=0; i<rows; i++) {
            for(int j=0; j<columns; j++) used[i][j] = 0;
        }
        for(int i=0; i<rows; i++) {
            for(int j=0; j<columns; j++) {
                if(board[i][j]==word.charAt(0)) {
                    used[i][j] = 1;
                    find = findNei(board, used, word, i, j, 1);
                    if(find == true) return find;
                    used[i][j] = 0;   //这里也要变回0,容易忘记
                }
            }
        }
        return find;
    }

    public boolean findNei(char[][] board, int[][] used, String word, int i, int j, int pos) {   //pos是需要匹配的字符位置
        if(pos == word.length()) return true;  //说明已经找到匹配了
        //检查上下左右的元素
        boolean find_up = false, find_bt = false, find_left = false, find_right = false;
        
        if(i>0 && board[i-1][j] == word.charAt(pos) && used[i-1][j] == 0) {  //检查上面的元素,必须满足三个条件:
        	//1. 存在上面的元素
        	//2. 上面的元素可以匹配这个字符
        	//3. 上面的元素没有被使用过
            used[i-1][j] = 1;
            find_up = findNei(board, used, word, i-1, j, pos+1);
            used[i-1][j] = 0;
        }
        if(find_up == true) return true;  //降低运行时间,如果没有符合的,再找其他方向
        
        if(i<board.length-1 && board[i+1][j] == word.charAt(pos) && used[i+1][j] == 0 ) {  //检查下面的元素
            used[i+1][j] = 1;
            find_bt = findNei(board, used, word, i+1, j, pos+1);
            used[i+1][j] = 0;
        }
        if(find_bt == true) return true;
        
        if(j>0 && board[i][j-1] == word.charAt(pos) && used[i][j-1] == 0) {  //检查左边的元素
            used[i][j-1] = 1;
            find_left = findNei(board, used, word, i, j-1, pos+1);
            used[i][j-1] = 0;
        }
        if(find_left == true) return true;
        
        if(j<board[0].length-1 && board[i][j+1] == word.charAt(pos) && used[i][j+1] == 0) { //检查右边的元素
            used[i][j+1] = 1;
            find_right = findNei(board, used, word, i, j+1, pos+1);
            used[i][j+1] = 0;
        }
        if(find_right == true) return true;
        
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值