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;
    } 
  • 相关阅读:
    注意安全 保重身体
    抽象和接口的区别
    哪些设计模式最值得学习
    超级扫盲什么是设计模式?
    简单工厂、工厂方法和抽象工厂模式
    通过领域模型设计物流系统
    json过滤特殊字符
    数据库性能优化JOIN方法说明[转]
    策略模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183670.html
Copyright © 2011-2022 走看看