每日一题:Leetcode-79 单词搜索

力扣题目

解题思路

java代码

力扣题目:

给定一个 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

解题思路:

算法原理
使用深度优先搜索(DFS)的方法在二维字符数组中查找给定的单词。从数组的每个位置开始尝试搜索,通过递归地在四个方向上进行探索,判断是否能构成给定的单词。

思路

  • exist方法中,遍历二维字符数组的每个位置,对每个位置调用dfs方法进行搜索。
  • dfs方法中,首先检查当前位置是否合法以及当前字符是否与单词中对应位置的字符匹配。如果不合法或不匹配,返回false。如果匹配且是单词的最后一个字符,返回true。否则,先标记当前位置已访问,然后在四个方向上递归调用dfs方法,只要有一个方向能成功找到单词,就返回true。最后恢复当前位置的字符。

代码分析

  • exist方法通过两层循环遍历数组的每个位置,启动搜索。
  • dfs方法:
    • 边界和字符匹配检查。
    • 处理单词结束的情况。
    • 标记当前位置,递归搜索四个方向。
    • 恢复当前位置字符。

时间复杂度:假设二维数组大小为,单词长度为,最坏情况下时间复杂度为O(4l * MN),因为在每个位置都可能向四个方向进行深度为的搜索。

空间复杂度:空间复杂度主要取决于递归栈的深度,最坏情况O(l),用于存储递归调用的状态。

java代码:

package org.example;

public class Leetcode79 {
    public static void main(String[] args) {
        System.out.println(exist(new char[][]{{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}}, "ABCCED"));
    }
    public static boolean exist(char[][] board, String word) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (dfs(board, word, i, j, 0)) {
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean dfs(char[][] board, String word, int i, int j, int k) {
        if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word.charAt(k)) {
            return false;
        } else if (k == word.length() - 1) {
            return true;
        }
        char temp = board[i][j];
        board[i][j] = ' ';
        boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board,word, i - 1, j, k + 1) || dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i, j - 1, k + 1);
        board[i][j] = temp;
        return res;
    }
}

更多详细内容同步到公众号,感谢大家的支持!

每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.2626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值