LeetCode 单词搜索

题目描述:


image.png
image.png

解题思路:
这里考虑到使用字符串,并且设计到字符的搜索,想到采用前缀树来进行存储,并根据前缀树进行搜索

  1. 建立前缀树的数据结构
  2. 遍历字符数组,进行搜索
  3. 搜索过的字符进行标记防止重复搜索
  4. 搜索到之后去重,最后返回结果
class TrieNode{
    //前缀树
    TrieNode[] nodes;
    String word;
    public TrieNode(){
        nodes = new TrieNode[26];
        word = "";
    }
}

class Trie{
    public TrieNode root;
    public Trie(){
        root = new TrieNode();
    }
    
    public void insert(String word){
        TrieNode node = root;
        for(char c : word.toCharArray()){
            if(node.nodes[c-'a']==null){
                node.nodes[c-'a'] = new TrieNode();
            }
            node = node.nodes[c-'a'];
        }
        node.word = word;
    }
}

class Solution {
    public static void dfs(int i,int j,char[][]board,TrieNode node,List<String> result){
        if(board[i][j] == '#')
            return;//当前位置已经遍历过了
        char c = board[i][j];
        board[i][j] = '#';//标记当前位置
        if(node.nodes[c-'a']==null){
            board[i][j] = c;
            return;
        }else{
            node = node.nodes[c-'a'];
            if(node.word.length()!=0){
              //去重
                if(!result.contains(node.word)){
                    result.add(node.word);
                }
            }
            
            
            if(i > 0){
                dfs(i-1,j,board,node,result);
            }
            if(i < board.length-1){
                dfs(i+1,j,board,node,result);
            }
            if(j > 0){
                dfs(i,j-1,board,node,result);
            }
            if(j < board[0].length-1){
                dfs(i,j+1,board,node,result);
            }
            board[i][j] = c;
        }
        
    }    
    public List<String> findWords(char[][] board, String[] words) {
        
        if(board.length <= 0 || board[0].length<=0||words.length<=0){
            return new ArrayList<>();
        }
        Trie tree = new Trie();
        for(String s : words){
            tree.insert(s);//通过字典创建前缀树
        }
        
        int row = board.length;
        int column = board[0].length;
        List<String> result = new ArrayList<>();
        for(int i = 0;i<row;i++){
            for(int j = 0; j < column;j++){
                dfs(i,j,board,tree.root,result);
            }
        }
        return result;
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一版先来个爆搜的,对于每一个单词,先找找有没有跟第一个字母相等的,找到后开始向四周找这个单词。后来超时。第二版,...
    DaydayHoliday阅读 893评论 0 1
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 3,015评论 0 1
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,021评论 0 13
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,466评论 0 1
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,356评论 0 3