汉字字典树[通俗易懂]

汉字字典树[通俗易懂]字典树的概念我就不说了,不过大多题目都是英文的字典树,我就闲的蛋疼去写了中文的字典树,实现起来也挺简单的。#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]={'
#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;
}
'}; 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; }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 基于udp的socket编程 c语言_C语言编程游戏

    基于udp的socket编程 c语言_C语言编程游戏1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。框图如图1.3所示UDP协议的服务器端流程服务器流程主要分为下述6个部分,即建立套接字、设置套接字地址参数、进行端口绑定、接收数据、发送数据、关闭套接字等。(1)建立套接字文件描述符,

  • CloudSim 学习实例1

    CloudSim 学习实例1Cloudsimexample1cloudsim教程例1解读创建一个含一台主机的数据中心,并在其上运行一个云任务代码packageorg.cloudbus.cloudsim.examples;/**Title:CloudSimToolkit*Description:CloudSim(CloudSimulation)Toolkitfor…

  • C++字符串流stringstream与string知识介绍与用法小结

    C++字符串流stringstream与string知识介绍与用法小结之前总结了C++的文件输出输入流的相关知识,通过介绍底层的streambuf缓冲区,从而与stringstream流(字符串流)联系了起来,本文就对此进行简单的介绍。首先介绍string。string是C++提供的字符串类,和C类型的字符串相比,除了有不限长度的优点外,还有其他许多方便的功能,其可以看成类似STL里vector数组的一种容器,可以方便的进行数据的增删改查,并可以进行…

  • ClientHeight_offsetheight获取高度不对

    ClientHeight_offsetheight获取高度不对clientHeight:包括padding但不包括border、水平滚动条、margin的元素的高度。对于inline的元素这个属性一直是0,单位px,只读元素。offsetHeight:包括padding、border、水平滚动条,但不包括margin的元素的高度。对于inline的元素这个属性一直是0,单位px,只读元素。style.height//返回元素的高度(包括元素高度,不包括内边距、边框和外边距)clientHeight//返回元素的高度(包括元素高度、

  • 在线体验流媒体服务器软件系统 (密码:123456)

    在线体验流媒体服务器软件系统 (密码:123456)无需下载体验,无需注册,无需费用,直接点击进入体验流媒体服务器直播,点播。感受八百里流媒体FlashP2P技术的先进。 流媒体服务器缩略图:如何在线体验:http://www.800li.net:8085密码:123123网站前台示例:http://www.800li.net/phpvod/或:www.ycitv.org/video

  • 情感词典是什么_中文情感分析词典

    情感词典是什么_中文情感分析词典【实例简介】1.褒义词及其近义词;2.否定词典;3.情感词汇本体;4.清华大学中文褒贬词典;5.台湾大学NTUSD情感词典;6.知网情感词典;7.汉语情感极值表;8.情感词典及其分类。【实例截图】【核心代码】SentimentAnalysisDic`–SentimentAnalysisDic|–知网Hownet情感词典||–主张词语(中文).txt||–主张词语(英文)…

发表回复

您的电子邮箱地址不会被公开。

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