zoukankan      html  css  js  c++  java
  • [笔记]:[字符串]trie数的基本构造 2017-05-12 10:46 50人阅读 评论(0) 收藏

    tire数

    Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。
    上图是一个tire数,构造tire数,代码如下

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    int  sz=1;
    int ch[1000][1000];
    char s[1000]; 
    int val[1000];
    void insert(char *s){
        int u=0;
        int len=strlen(s);
        for(int i=0;i<len;i++){
            int c=s[i]-'a';
            if(ch[u][c]>0){//如果以前有节点 就继续往下找 
                u=ch[u][c];
                //if(val[u]>0)  return 1;
            }
            else//没有就建一个新节点 
            {
                //flag=1;//建立了一个新的节点 则代表此单词没有以前单词的前缀 
                //val[sz]=0;
                ch[u][c]=sz;//sz是序号 
                u=sz;//更新节点 
                sz++;
            }
        }
        //val[u]=1;//单词结束 val[u]标记为1 代表成为了一个单词 
        //if(!flag) return 1;//如果没有建立一个新的节点 代表 这个单词肯定包含在以前的单词内 
        //else return 0;
    } 
    int main(){
        int n;
        scanf("%d",&n);
        getchar();//数字后的回车 
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            s[strlen(s)]='';
            insert(s);
        }
        return 0;
    } 

    tire树的字母匹配 如果有相同前缀输出NO 没有输出YES

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace  std;
    int  sz=1;
    int ch[1000][1000];
    char s[1000]; 
    int val[1000];
    bool insert(char *s){
        int u=0;
        int len=strlen(s);
        int flag=0;
        for(int i=0;i<len;i++){
            int c=s[i]-'a';
            if(!ch[u][c])
            {
                flag=1;//建立了一个新的节点 则代表此单词没有以前单词的前缀 
                val[sz]=0;
                ch[u][c]=sz;
                sz++;
            }
            u=ch[u][c];
            if(val[u]) return 1;
        }
        val[u]=1;//单词结束 val[u]标记为1 代表成为了一个单词 
        if(!flag) return 1;
        //如果没有建立一个新的节点 代表 这个单词肯定包含在以前的单词内 
        else return 0;
    } 
    int main(){
        int n;
        scanf("%d",&n);
        getchar();
        int f;
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            s[strlen(s)]='';
            f=insert(s);
            if(f==1)break;
        }
        if(f) cout<<"NO";
        else cout<<"YES";
        return 0;
    } 
  • 相关阅读:
    HDUOJ--4565 So Easy!
    简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
    java 快速求素数
    狄斯奎诺(dijkstra 模板)
    2014 蓝桥杯 阶梯报告(含代码 详细讲解)
    HDUOJ---汉洛塔IX
    小错误系列
    HDUOJ-----4510 小Q系列故事——为什么时光不能倒流
    HDUOJ----4509湫湫系列故事——减肥记II
    HDUOJ-----4506小明系列故事——师兄帮帮忙
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183670.html
Copyright © 2011-2022 走看看