大家好,又见面了,我是你们的朋友全栈君。
一开始我也想用map 但是处理不好其他字符。。
看了题解 多多学习! 很巧妙 就是粗暴的一个字符一个字符的来 分为小写字母和非小写字母两个部分 一但单词结束的时候就开始判断。
#include<bits/stdc++.h> using namespace std; int main() { string a,b; map<string ,string >ma; cin>>a; while(cin>>a&&a!="END") { cin>>b;ma[b]=a; } cin>>a; char s[3500];getchar(); while(gets(s)) { if(!strcmp(s,"END"))break; int n=strlen(s); a=""; for(int i=0;i<n;i++) { if(islower(s[i]))a+=s[i]; else { if(ma.find(a)!=ma.end()) cout<<ma[a]; else cout<<a; cout<<s[i]; a=""; } } cout<<endl; } }
View Code
字典树写法
注意malloc 和初始化 字符串赋值用strcpy 不申请内存根本无法使用
因为 gets 和getchar 的问题检查了半小时 注意!!!
gets会吸收\n给忘记了。。。。
有关字典树的指针写法规范一下
#include <iostream> #include <cstdio> #include <cstring> #include<malloc.h> using namespace std; struct node { char *val; node *next[26]; int flag; node() { for(int i=0;i<26;i++) { next[i]=NULL; } flag=0; } }; node *p,*root=new node(); void change(char *s,char *v) { p=root; for(int i=0;s[i]!='\0';i++) { int ch=s[i]-'a'; if(p->next[ch]==NULL) p->next[ch]=new node(); p=p->next[ch]; } p->flag=1; p->val=(char*)malloc((strlen(v)+1)*sizeof(char)); strcpy(p->val,v); } void find1(char *s) { p=root; for(int i=0;s[i]!='\0';i++) { int ch=s[i]-'a'; if(p->next[ch]==NULL) { printf("%s",s);return; } p=p->next[ch]; } if(p->flag)printf("%s",p->val); else printf("%s",s); } int main() { char a[3010],b[3010]; gets(a); while(scanf("%s",a)==1) { if(!strcmp(a,"END"))break; scanf("%s",b); change(b,a); } getchar(); gets(a); char s[3010]; while(gets(a)) { if(!strcmp(a,"END"))break; int k=0; for(int i=0;i<strlen(a);i++) { if(islower(a[i]))s[k++]=a[i]; else { s[k]='\0'; find1(s); printf("%c",a[i]); k=0; } } printf("\n"); } return 0; }
View Code
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154431.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...