力扣--LCR 129.字母迷宫

题目

字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid,请判断玩家是否能在 grid 中找到目标单词 target。

注意:寻找单词时 必须 按照字母顺序,通过水平或垂直方向相邻的单元格内的字母构成,同时,同一个单元格内的字母 不允许被重复使用 。

示例 1:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCCED"

输出:true

示例 2:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "SEE"

输出:true

示例 3:

输入:grid = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], target = "ABCB"

输出:false

提示:

复制代码
m == grid.length
n = grid[i].length
1 <= m, n <= 6
1 <= target.length <= 15
grid 和 target 仅由大小写英文字母组成

代码

class Solution {

int n;

int m;

int len;

boolean[][] visited;

public boolean wordPuzzle(char[][] grid, String target) {

this.n = grid.length;

this.m = grid[0].length;

this.len = target.length();

visited = new boolean[n][m];

复制代码
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(dsf(grid, i, j, target, 0)){
                return true;
            }
        }
    }

    return false;
}
boolean dsf(char[][] grid, int i, int j, String target, int k){
    // 判断是否越界,已经访问过或者不匹配
    if(i < 0 || i >= n || j < 0 || j >= m || grid[i][j] != target.charAt(k)){
        return false;
    }

    if(k == len - 1){
        return true;
    }
    //visited[i][j] = true;
    grid[i][j] = '\n';
    // 四个方向都搜索一下
    boolean res = dsf(grid, i, j + 1, target, k + 1) ||
                  dsf(grid, i + 1, j, target, k + 1) ||
                  dsf(grid, i, j - 1, target, k + 1) ||
                  dsf(grid, i - 1, j, target, k + 1);

    grid[i][j] = target.charAt(k);
    return res;
    // 时间复杂度:mn * 3^len

}

}

时间复杂度:O(3^K * MN) : 最差情况下,需要遍历矩阵中长度为 KK 字符串的所有方案,时间复杂度为 O(3^K);矩阵中共有 MN 个起点,时间复杂度为 O(MN)

空间复杂度:O(k)

相关推荐
Dream it possible!5 分钟前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树的最小绝对差(85_530_C++_简单)
c++·leetcode·面试
xxxxxxllllllshi6 分钟前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
前端小L10 分钟前
图论专题(二十二):并查集的“逻辑审判”——判断「等式方程的可满足性」
算法·矩阵·深度优先·图论·宽度优先
铁手飞鹰15 分钟前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
专业抄代码选手2 小时前
【Leetcode】1930. 长度为 3 的不同回文子序列
javascript·算法·面试
[J] 一坚2 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
czlczl200209252 小时前
算法:二叉搜索树的最近公共祖先
算法
司铭鸿2 小时前
祖先关系的数学重构:从家谱到算法的思维跃迁
开发语言·数据结构·人工智能·算法·重构·c#·哈希算法
程序员小远2 小时前
Appium-移动端自动测试框架详解
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
SoleMotive.3 小时前
redis实现漏桶算法--https://blog.csdn.net/m0_74908430/article/details/155076710
redis·算法·junit