汉字字典树[通俗易懂]

汉字字典树[通俗易懂]字典树的概念我就不说了,不过大多题目都是英文的字典树,我就闲的蛋疼去写了中文的字典树,实现起来也挺简单的。#include<iostream>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<map>usingnamespacestd;…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

字典树的概念我就不说了,不过大多题目都是英文的字典树,我就闲的蛋疼去写了中文的字典树,实现起来也挺简单的。

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <map>

using namespace std;

//字典树,根节点为1
struct Node
{
    
    int length=0;
    string lines="";
    map<string,int> words;
    map<string,int> count;
}tree[1005];
//表示字典树的节点数
int len;
string res[105];

/*char* word(char *aw,int j)
{
    char w[105]={'\0'};
    int p=0;
    for(int i=j*3;i<j*3+3;i++)
    {
        w[p++]=aw[i];
    }
    return w;
}
void strcatt(char *as,char *bs,int j)
{
    int l=strlen(as);
    
    for(int i=l;i<l+3;i++)
    {
        as[i]=bs[j*3+i-l];
    }
}*/
//往字典树立插入字符串
void insert(string a,int i,int j)
{
  
    if(i==a.length()/3)
    {
        
        return;
    }
    if(tree[j].words[a.substr(i*3,3)]!=0)
    {
        insert(a,i+1,tree[j].words[a.substr(i*3,3)]);
    }
    else
    {
        tree[j].words[a.substr(i*3,3)]=++len;
        tree[j].lines+=a.substr(i*3,3);
        tree[j].length+=3;
        if(i==a.length()/3-1)
            tree[j].count[a.substr(i*3,3)]++;
        insert(a,i+1,len);
    }
}
/*
bool equal(char *ae,char *be)
{
    if(strlen(ae)!=strlen(be))
        return false;
    else
    {
        for(int i=0;i<strlen(ae);i++)
        {
            if(ae[i]!=be[i])
                return false;
        }
        return true;
    }
        
}*/
void remove(Node &s,string x)
{
    int y=0;
    for(int i=0;i<s.length/3;i++)
    {
        if(s.lines.substr(i*3,3)==x)
        {
            y=i;break;
        }
    }
    for(int i=y*3;i<s.length;i++)
    {
        s.lines[i]=s.lines[i+3];
    }
    s.length-=3;
}
//删除字符串
bool del(string a,int i,int j)
{
    if(tree[j].words[a.substr(i*3,3)]==0)
        return false;
    else
    {
        int x=tree[j].words[a.substr(i*3,3)];
        tree[j].words[a.substr(i*3,3)]=0;
        remove(tree[j],a.substr(i*3,3));
        return del(a,i+1,x);
    }
}

//查询某个字符串为前缀的所有词

void QueryPrefix(string a,int i,int j,string str,int &l2)
{
    if(i>=a.length()/3)
    {
        if(tree[j].length==0)
        {
          
            return;
        }
        
        for(int k=0;k<tree[j].length/3;k++)
        {
           
            str+=tree[j].lines.substr(k*3,3);
          
            if(tree[j].count[tree[j].lines.substr(k*3,3)]!=0)
                res[l2++]=str;
            QueryPrefix(a, i+1, tree[j].words[tree[j].lines.substr(k*3,3)],str,l2);
            
        }
    }
    else if(tree[j].words[a.substr(i*3,3)]==0)
        return;
    else
    {
        //strcatt(str,aq,i);
        str+=a.substr(i*3,3);
      
        if(i==a.length()/3-1)
            res[l2++]=str;
        QueryPrefix(a, i+1, tree[j].words[a.substr(i*3,3)],str,l2);
    }
}
//查询某个字符串是否存在
bool IsExist(string a,int i,int j)
{
    if(i==a.length()/3)
    {
        return false;
    }
 
    if(tree[j].words[a.substr(i*3,3)]==0)
        return false;
    else
    {
        if(i==a.length()/3-1&&tree[j].count[a.substr(i*3,3)]!=0)
        {
            return true;
        }
        return IsExist(a, i+1,tree[j].words[a.substr(i*3,3)]);
    }
}
string input[1005];
int n;
string output;

int main()
{
    printf("请输入要插入字典树的字符串数组的长度\n");
    scanf("%d",&n);
    printf("请输入要插入字典树的字符串数组\n");
    len=1;
    for(int i=0;i<n;i++)
    {
        cin>>input[i];
        insert(input[i],0,1);
    }
    
    printf("请输入key\n");
    cin>>output;
    printf("查找key是否存在\n");
    IsExist(output,0, 1);
    if(IsExist(output,0,1))
        printf("key存在\n");
    else
        printf("key不存在\n");
    
    printf("找出所有以key为前缀的字符串\n");
    

    string str="";
    int l1=0;int l2=0;
    QueryPrefix(output, 0, 1,str, l2);
    for(int i=0;i<l2;i++)
        cout<<res[i]<<endl;
    
    
    
    printf("key为一句话,找出key中存在的最长词\n");
    printf("输入key\n");
    cin>>output;
    int le=output.length();
    string xx="";
    string ans="";
    int res2=0;
    for(int i=0;i<le/3;i++)
    {
        for(int l=3;i*3+l<=le;l+=3)
        {
            xx=output.substr(i*3,l);
            
            if(IsExist(xx, 0, 1))
            {
                if(res2<l)
                {
                    res2=l;
                    ans=xx;
                }
            }
        }
    }
    if(res2==0)
    {
        printf("不存在\n");
    }
    else
    {
        cout<<ans<<endl;
    }
    return 0;
    
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196603.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue路由懒加载_vuerouter路由懒加载

    Vue路由懒加载_vuerouter路由懒加载使用Vue路由懒加载时报了以下错误:经过百度发现,出现该问题的原因是:import属于异步引用组件,需要特殊的babel-loader处理解决办法:安装babel用来编译import异步引用方法的模块babel-plugin-syntax-dynamic-importcnpminstallbabel-plugin-syntax-dynamic-import-D在.b…

    2025年6月2日
    1
  • Java 中 Boolean 和 boolean的区别

    Java 中 Boolean 和 boolean的区别上次一个同学问 Boolean 类型的值不是只有 true 和 false 两种吗 为什么他定义的属性出现了 null 值 我们应该先明确一点 boolean 是 Java 的基本数据类型 Boolean 是 Java 的一个类 boolean 类型会在 赋零值 阶段给属性赋 false 而 Boolean 是一个类 会在 赋零值 阶段给对象赋 null 如果是静态属性 会在类加载时被赋值 如果是普通类属性 会在实例化对象时赋值 这两点可以了解一下 类加载机制 和 对象创建过程 类加载机制

    2025年6月14日
    0
  • 解决问题__Visual Studio 光标变成方块

    解决问题__Visual Studio 光标变成方块

    2022年3月13日
    47
  • 虚拟机扩容磁盘后扩容分区_如何将磁盘主分区设置为活动分区

    虚拟机扩容磁盘后扩容分区_如何将磁盘主分区设置为活动分区当服务器数据太多的时候,硬盘不足的时候就得考虑扩容,为了不影响业务的正常运行,一般云服务器的本地磁盘都是不支持分区的,因为业务数据通常是不能中断和移动的,无论是增加硬盘或在原有磁盘增加分区的方式扩容,势必会存在卸载、挂载、移动等操作。所以对于云硬盘,如果我们要把他作为数据盘。即使能分区,也最好不要分区,以免以后扩容麻烦。以下用虚拟机看一下对未分区磁盘扩容的效果[root@k8s-node01…

    2022年8月30日
    1
  • anaconda tensorflow pycharm_tensorflow搭建

    anaconda tensorflow pycharm_tensorflow搭建目录安装anaconda安装pycharm安装tensorflowpycharm新建有tensorflow模块的Project目前正在学习tensorflow库的深度学习的一些知识,基本的安装和环境配置做个记录。安装anaconda到官网上下载安装,ana2和ana3都可以,我这里都下载了。安装时候注意勾选写入路径。安装到某个盘,以后的环境会在那里生成。安装pycharm到官网上下载安装…

    2022年8月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号