• 算法-单词搜索 II


    算法-单词搜索 II

    1 题目概述

    1.1 题目出处

    https://leetcode.cn/problems/word-search-ii/description/?envType=study-plan-v2&envId=top-interview-150

    1.2 题目描述

    在这里插入图片描述
    在这里插入图片描述

    2 DFS

    2.1 解题思路

    每个格子往上下左右四个方向DFS,拼接后的单词如果在答案集中,则记录下来。

    同时为了避免DFS时往回找,需要记录下已访问记录。

    2.2 代码

    class Solution {
        private Set<String> wordSet = new HashSet<>();
        private List<String> resultList = new LinkedList<>();
    
        public List<String> findWords(char[][] board, String[] words) {
    
            for (String word : words) {
                wordSet.add(word);
            }
            StringBuilder sb = new StringBuilder();
            char[][] visitSet = new char[board.length][board[0].length];
    
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    dfs(i, j, board, sb, visitSet);
                }
            }
            return resultList;
        }
        private void dfs(int i, int j, char[][] board, StringBuilder sb, char[][] visitSet) {
            if (sb.length() > 10) {
                return;
            }
            if (visitSet[i][j] == 1) {
                return;
            }
            visitSet[i][j] = 1;
            sb.append(board[i][j]);
            String currentStr = sb.toString();
            if (wordSet.contains(currentStr)) {
                resultList.add(currentStr);
                wordSet.remove(currentStr);
            }
    
            if (i > 0) {
                dfs(i - 1, j, board, sb, visitSet);
            }
            if (i < board.length - 1) {
                dfs(i + 1, j, board, sb, visitSet);
            }
            if (j > 0) {
                dfs(i, j - 1, board, sb, visitSet);
            }
            if (j < board[0].length - 1) {
                dfs(i, j + 1, board, sb, visitSet);
            }
    
            sb.deleteCharAt(sb.length() - 1);
            visitSet[i][j] = 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    2.3 时间复杂度

    在这里插入图片描述
    O(M * N * 4^10) 字符串最多10

    2.4 空间复杂度

    O(10)

    3 DFS+Trie树

    3.1 解题思路

    3.2 代码

    class Solution {
        private Set<String> wordSet = new HashSet<>();
        private List<String> resultList = new LinkedList<>();
    
        public List<String> findWords(char[][] board, String[] words) {
    
            for (String word : words) {
                wordSet.add(word);
            }
            StringBuilder sb = new StringBuilder();
            char[][] visitSet = new char[board.length][board[0].length];
    
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    dfs(i, j, board, sb, visitSet);
                }
            }
            return resultList;
        }
        private void dfs(int i, int j, char[][] board, StringBuilder sb, char[][] visitSet) {
            if (sb.length() > 10) {
                return;
            }
            if (visitSet[i][j] == 1) {
                return;
            }
            visitSet[i][j] = 1;
            sb.append(board[i][j]);
            String currentStr = sb.toString();
            if (wordSet.contains(currentStr)) {
                resultList.add(currentStr);
                wordSet.remove(currentStr);
            }
    
            if (i > 0) {
                dfs(i - 1, j, board, sb, visitSet);
            }
            if (i < board.length - 1) {
                dfs(i + 1, j, board, sb, visitSet);
            }
            if (j > 0) {
                dfs(i, j - 1, board, sb, visitSet);
            }
            if (j < board[0].length - 1) {
                dfs(i, j + 1, board, sb, visitSet);
            }
    
            sb.deleteCharAt(sb.length() - 1);
            visitSet[i][j] = 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    3.3 时间复杂度

    在这里插入图片描述

    4 DFS+Trie树 优化

    4.1 解题思路

    4.2 代码

    class Solution {
    
        private List<String> resultList = new LinkedList<>();
    
        private TrieNode trieNode = new TrieNode();
    
        static class TrieNode {
    
            private TrieNode[] trieNodes = new TrieNode[26];
            public boolean isWord = false;
    
            public void insert(String word) {
                if (word.length() == 0) {
                    isWord = true;
                    return;
                }
                int index = word.charAt(0) - 'a';
                if (null == trieNodes[index]) {
                    trieNodes[index] = new TrieNode();
                }
                trieNodes[index].insert(word.substring(1));
            }
        }
    
        public List<String> findWords(char[][] board, String[] words) {
    
            for (String word : words) {
                trieNode.insert(word);
            }
            StringBuilder sb = new StringBuilder();
            char[][] visitSet = new char[board.length][board[0].length];
    
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    dfs(i, j, board, sb, visitSet, trieNode);
                }
            }
            return resultList;
        }
    
        private void dfs(int i, int j, char[][] board, StringBuilder sb, char[][] visitSet, TrieNode ct) {
            if (sb.length() > 10) {
                return;
            }
            if (visitSet[i][j] == 1) {
                return;
            }
            visitSet[i][j] = 1;
            sb.append(board[i][j]);
            ct = ct.trieNodes[board[i][j] - 'a'];
    
            if (null != ct) {
                if (ct.isWord) {
                    resultList.add(sb.toString());
                    ct.isWord = false;
                } 
                if (i > 0) {
                    dfs(i - 1, j, board, sb, visitSet, ct);
                }
                if (i < board.length - 1) {
                    dfs(i + 1, j, board, sb, visitSet, ct);
                }
                if (j > 0) {
                    dfs(i, j - 1, board, sb, visitSet, ct);
                }
                if (j < board[0].length - 1) {
                    dfs(i, j + 1, board, sb, visitSet, ct);
                }
            }
            sb.deleteCharAt(sb.length() - 1);
            visitSet[i][j] = 0;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    4.3 时间复杂度

    在这里插入图片描述

    参考文档

  • 相关阅读:
    C. Yarik and Array Codeforces Round 909 (Div. 3) 1899C
    scanf总结
    springboot整合Redis
    视频太大怎么压缩变小?超过1G的视频这样压缩
    定时备份mysql数据库
    远程登陆Win10自带子系统Ubuntu-22.04
    UG\NX二次开发 获取调色板CDF文件的内容
    音视频云架构
    【Python】Python基础
    C++17之std::invoke: 使用和原理探究(全)
  • 原文地址:https://blog.csdn.net/baichoufei90/article/details/133001692