☆打卡算法☆LeetCode 212. 单词搜索 II 算法解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ☆打卡算法☆LeetCode 212. 单词搜索 II 算法解析

大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。

一、题目

1、算法题目

“给定一个二维字符网格和一个单词列表,返回二维网格中的所有单词。”

2、题目描述

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。

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

1702442457131.jpg

示例 1:
输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ["oath","pea","eat","rain"]
输出:["eat","oath"]
示例 2:
输入: board = [["a","b"],["c","d"]], words = ["abcb"]
输出: []

二、解题

1、思路分析

题意要求给定一个二维字符网格和单词列表,返回二维网格中的所有单词。

遇到这种匹配单词的都可以试着使用字典树来解决,字典树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。

字典树已经实现过很多次了,就不多说了,但是字典树只是搜索单词,而本题是要找出所有的单词,所以需要加一个回溯操作。

遍历二维网格中的所有单元格,深度优先搜索所有从当前单元格触发组成的路径。

如果当前路径是单词列表中的单词,就加入到结果集中。

如果当前路径是单词列表中的一个单词的前缀,则继续搜索,如果不是,就剪枝,这样就可以将单词列表中所有字符串先添加到前缀树中,而后用字典树来查询当前路径是否为单词列表中的任意一个单词的前缀了。

2、代码实现

代码参考:

class Solution {
    int[][] dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    public List<String> findWords(char[][] board, String[] words) {
        Trie trie = new Trie();
        for (String word : words) {
            trie.insert(word);
        }
        Set<String> ans = new HashSet<String>();
        for (int i = 0; i < board.length; ++i) {
            for (int j = 0; j < board[0].length; ++j) {
                dfs(board, trie, i, j, ans);
            }
        }
        return new ArrayList<String>(ans);
    }
    public void dfs(char[][] board, Trie now, int i1, int j1, Set<String> ans) {
        if (!now.children.containsKey(board[i1][j1])) {
            return;
        }
        char ch = board[i1][j1];
        now = now.children.get(ch);
        if (!"".equals(now.word)) {
            ans.add(now.word);
        }
        board[i1][j1] = '#';
        for (int[] dir : dirs) {
            int i2 = i1 + dir[0], j2 = j1 + dir[1];
            if (i2 >= 0 && i2 < board.length && j2 >= 0 && j2 < board[0].length) {
                dfs(board, now, i2, j2, ans);
            }
        }
        board[i1][j1] = ch;
    }
}
class Trie {
    String word;
    Map<Character, Trie> children;
    boolean isWord;
    public Trie() {
        this.word = "";
        this.children = new HashMap<Character, Trie>();
    }
    public void insert(String word) {
        Trie cur = this;
        for (int i = 0; i < word.length(); ++i) {
            char c = word.charAt(i);
            if (!cur.children.containsKey(c)) {
                cur.children.put(c, new Trie());
            }
            cur = cur.children.get(c);
        }
        cur.word = word;
    }
}

1702383535714.jpg

3、时间复杂度

时间复杂度:O(m x n x 3l-1)

其中m是二维网格的高度,n是二维网格的宽度,l是最长单词的长度,需要遍历m x n个单元格,每个单元格的最多需要遍历 4 x 3l-1条路径。

空间复杂度:O(k x l)

其中k是单词列表的长度,l是单词的长度,最坏情况下,需要O(k x l)用于存储字典树。

三、总结

在具体实现中:

  • 因为单词不能重复,所以需要哈希表进行去重
  • 在回溯过程中,不需要每一步都判断当前路径是否是单词列表中的单词前缀,只需要记录下路径中每个单元格所对应的前缀树节点,只需要判断新增的单元格是否是上一个单元格对应的前缀树的子节点即可。
相关文章
|
9天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
17 4
|
9天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
15 1
|
13天前
|
算法 Java
[Java·算法·简单] LeetCode 283. 移动零
[Java·算法·简单] LeetCode 283. 移动零
17 2
|
13天前
|
存储 算法 Java
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
|
2天前
力扣每日一题 6/11 暴力搜索
力扣每日一题 6/11 暴力搜索
5 0
|
2天前
|
算法 测试技术 索引
力扣经典150题第三十二题:串联所有单词的子串
力扣经典150题第三十二题:串联所有单词的子串
5 0
|
2天前
|
算法
力扣经典150题第二十一题:反转字符串中的单词
力扣经典150题第二十一题:反转字符串中的单词
6 0
|
2天前
|
算法
力扣经典150题第十九题:最后一个单词的长度
力扣经典150题第十九题:最后一个单词的长度
6 0
|
2天前
|
机器学习/深度学习 算法
机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略
【6月更文挑战第28天】**机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略。工具如scikit-optimize、Optuna助力优化,迁移学习和元学习提供起点,集成方法则通过多模型融合提升性能。资源与时间考虑至关重要,交叉验证和提前停止能有效防止过拟合。**
5 0
|
9天前
|
算法 Python
二维矩形件排样算法之最低水平线搜索算法实现
二维矩形件排样算法之最低水平线搜索算法实现
8 0