ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 0212 Word Search II

2022-06-04 09:32:34  阅读:155  来源: 互联网

标签:Search TrieNode 单元格 II 0212 board words children result


原题传送门

1. 题目描述

2. Solution

1、思路分析
根据题意,需要逐个遍历二维网格中的每一个单元格,然后搜索从该单元格出发的所有路径,找到其中对应words中的单词的路径。因为这是一个回溯的过程,所以有如下算法:
1》遍历二维网格中的所有单元格。
2》深度优先搜索所有从当前正在遍历的单元格出发,由相邻且不重复的单元格组成的路径。因为题目要求同一个单元格内的字母在一个单词中不能被重复使用;所以在深度优先搜索的过程中,每经过一个单元格,都将该单元格的字母临时修改为特殊字符(如 '#'),以避免再次经过该单元格。
3》如果当前路径是words中的单词,则将其添加到结果集中。如果当前路径是words中任意一个单词的前缀,则继续搜索;反之,如果当前路径不是words中任意一个单词的前缀,则剪枝。可以将words中的所有字符串先添加到前缀树中,而后用O(n)的时间复杂度查询当前路径是否为words中任意一个单词的前缀。

2、代码实现

package Q0299.Q0212WordSearchII;

import java.util.ArrayList;
import java.util.List;

/*
    Backtracking + Trie
 */
public class Solution {
    public List<String> findWords(char[][] board, String[] words) {
        List<String> result = new ArrayList<>();
        TrieNode root = buildTrie(words);
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                dfs(board, i, j, root, result);
            }
        }
        return result;
    }

    private void dfs(char[][] board, int i, int j, TrieNode p, List<String> result) {
        char c = board[i][j];
        if (c == '#' || p.children[c - 'a'] == null) return;
        p = p.children[c - 'a'];
        if (p.word != null) {       // found one
            result.add(p.word);
            p.word = null;      //  de-duplicate
        }

        board[i][j] = '#';
        if (i > 0) dfs(board, i - 1, j, p, result);
        if (j > 0) dfs(board, i, j - 1, p, result);
        if (i < board.length - 1) dfs(board, i + 1, j, p, result);
        if (j < board[0].length - 1) dfs(board, i, j + 1, p, result);
        board[i][j] = c;
    }

    private TrieNode buildTrie(String[] words) {
        TrieNode root = new TrieNode();
        for (String w : words) {
            TrieNode p = root;
            for (int i = 0; i < w.length(); i++) {
                char c = w.charAt(i);
                if (p.children[c - 'a'] == null)
                    p.children[c - 'a'] = new TrieNode();
                p = p.children[c - 'a'];
            }
            p.word = w;
        }
        return root;
    }
}

class TrieNode {
    public String word;
    public TrieNode[] children = new TrieNode[26];
}

3、复杂度分析
时间复杂度:

标签:Search,TrieNode,单元格,II,0212,board,words,children,result
来源: https://www.cnblogs.com/junstat/p/16341278.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有