字典树

136 阅读2分钟

什么是字典树?

字典树也叫做前缀树,是处理大量长字符串比较有效的方法之一,其原理就是通过树这一数据结构类型,把每个字母当成一个节点,共用同一个初始节点开始遍历,更快速方便地找到目标字符串,接下来就和小编一起了解一下实现原理叭(doge)

字典树的实现原理\

n\n用一个trie类来构建这个字典树,通过子节点数组(保存26个字母)来作为索引寻找子节点,同时在这个类中加上一个bool型判断是否为单词,以下是简单的构建方法\n\npublic class Trie\n{\n private int SIZE=26;\n private TrieNode root;//字典树的根\n \n Trie() //初始化字典树\n {\n root=new TrieNode();\n }\n \n

private class TrieNode //字典树节点\n {\n private int num;//有多少单词通过这个节点,即由根至该节点组成的字符串模式出现的次数\n private TrieNode[] son;//所有的儿子节点\n private boolean isEnd;//是不是最后一个节点\n private char val;//节点的值\n private boolean haveSon;\n \n TrieNode()\n {\n num=1;\n son=new TrieNode[SIZE];\n isEnd=false;\n haveSon=false;\n }\n }\n \n//建立字典树\n(以上部分内容来自百度百科)\n\n废话不多说直接来道力扣练手题\n\n力扣\n\n有兴趣的朋友先试试\n\n这道题按字典序排列一些数字,我心想打出排序规则然后无脑dfs不就行,然后做了一下发现wa了两个点,听见师兄在喊用字典树前缀树打出来,我就灵鸡一冻,想到可以用字典树来查询,不过这道题有几个比较坑的点,就是构建树的时候需要使用数字,比如从1开始,要找10到19的数字,就得储存10和20作为开始和结尾数,比如first=cur10;那么last=(cur+1)10;而且最后一个树不一定是整十的树,储存的时候还需要考虑边界问题,浅浅实现5分钟再debug2小时就能把这道题a出来,真是良心好题\n\nclass Solution {\ntypedef long long ll;\npublic:\n int findKthNumber(int n, int k) {\n ll num,cur,first,last;\n \n cur = 1;\n --k;\n while(k > 0){\n num=0;\n first=cur;\n last= cur+1;\n while( first \u003C= n ){\n num+=min((ll)n+1ll,last)-first;\n \n first=10;\n last=10;\n \n }\n if(num \u003C= k){\n ++cur;\n k-=num;\n }\n else{\n cur*=10;\n --k;\n }\n }\n return cur;\n