字典树

//构造字典树
boolean insert(Strin str){
    Node p =  head;
    for(int i = 0 ; i<str.length();i++){
        p.count++;//当前节点被访问+1
        if(p.end)return false;//存在前缀
        if(p.child[str.charAt(i)-'0']==null)
            p.child[str.charAt(i)-'0'] = new Node();
            p = p.child[str.charAt(i)-'0'];
    }
    p.count++;
    if(p.count>1)return false;
    p.end = true;
    return true;
}

关于题中可能出现的两种上传,分别看两次false,

如果p.end,也就是当前字符串s已经走到了保存在字典数的另一个字串的结尾,举例:010和01(前面的为当前字符串s),此时村长前后缀关系;

另一种情况,如果当前字符串s为保存着在字典数的一部分,举例:01和010。

这两种情况下,都可以确定访问过的节点count>1

先上图,如果输入的是01,10,010,0000:

155606639.jpg

第一个和第三个存在前后缀关系

如果输入的是01,10,0010,0000:

155743291.jpg

完整代码:

package com.java.struture;
import java.util.Scanner;
class Trie{
    //Trie树提供给了一种能够在字符串的长度n时间内判断出来是否在已有集合中已经存在这个字符串了
    class Node{//字典数节点
        Node[] child = new Node[10];//儿子节点
        boolean end = false;//是否是其中一个二进制码 的最后一个节点
        int count = 0 ;//此节点上通过的字符(数字)个数
    }
    Node head = null;//字典数的根节点
    void clear(){
        head = new Node();
    }
    boolean insert(String str){//构造字典树
        Node p = head;
        for(int i = 0 ; i < str.length(); i++){
            p.count++;
            if(p.end)
                return false;//存在前缀
            if(p.child[str.charAt(i)-'0']==null)
                p.child[str.charAt(i)-'0'] = new Node();
            p = p.child[str.charAt(i)-'0'];
        }
        p.count++;
        if(p.count > 1)
            return false;//存在前缀
        p.end = true;
        return true;
    }
}
public class TrieMain {
    public static void main(String[] args) {
        Trie tree = new Trie();
        Scanner sc = new Scanner(System.in);
        int count = 0 ;
        while(sc.hasNext()){
            String s = sc.next();
            count++;
            tree.clear();
            int flag = 0;
            while(!s.equals("9")){
                if(!tree.insert(s))
                    flag++;
                s = sc.next();
            }
            if(flag!=0){//存在前缀,输出
                System.out.println("Set "+count+" is not immediately");
            }else{
                System.out.println("Set "+count+" is immediately");
            }
        }
    }
}


你可能感兴趣的:(java,前缀,字典树)