栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

字典树的运用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

字典树的运用

前缀树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串,单词查找树,多叉树结构/

给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。

连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串。

这道题的题目第一想法就是字典树.字典树和深度遍历可以解决

class Solution {

    private Node root=new Node();//封装定义树的节点创建对象

    public List findAllConcatenatedWordsInADict(String[] words) {

Listans=new ArrayList<>();

Arrays.sort(words,(a,b)->a.length()-b.length());//将单词排序入集合里

for(String word:words){//分开单词放入单词组里

    if(!word.isEmpty()){

        if(dfs(word,0)){

            ans.add(word);

        }else{//不为连接词则放入单词树

            insert(word);

        }

    }

}

return ans;

    }

    private void insert(String word){

        Node node=this.root;

        for(int i=0;i

            if(node.children[word.charAt(i)-'a']==null){

                node.children[word.charAt(i)-'a']=new Node();//不能分割,建立新的节点集

            }

            node=node.children[word.charAt(i)-'a'];

        }

        node.isEnd=true;//能分割,得到的节点单词为true

    }

    private boolean dfs(String word,int i){

        if(i==word.length()){

            return true;}

            Node node=this.root;

while(i

        if(node.children[word.charAt(i)-'a']==null){

            return false;//不能出现只存在一个单词

        }

        node=node.children[word.charAt(i)-'a'];

        if(node.isEnd&&dfs(word,i+1)){

            return true;//形成完整单词,深入下一层

        }

        i++;

    }

    return false;

}

class Node{

    boolean isEnd;

    Node[]children;

    Node(){

        this.isEnd=false;//用boolea定义NODE的节点调用

        this.children=new Node[26];//子节点是新的26位

    }

}}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/683524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号