Hdu 1075 字符串
这道题用的是字典树,其中有如何建树,
字典树可以方便查找,但是内存消耗大,但是这道题很符合字典树。是一道很好的字典树应用的题。
并且在写代码的过程中,还有很多的细节要处理。不仅仅是建好树就可以解决这道题的。还建好树后还需要处理好字符串,
如何控制读取一串字符中的单个单词到字典树中去比对,替换也是这道题的难点。并且还要注意指针的初始化,和指针型数组的空间的申请。
还有一点我在做题的过程中卡了很久的一个地方已经标记在代码当中。是我认为要注意的地方。
#include<stdio.h>
#include<string.h>
#include <iostream>
#include<stdlib.h>
using namespace std;
struct tree{
char *final;
tree *next[26];
int flage;
tree(){
for(int i=0;i<26;i++){
next[i]=NULL;
}
flage=0;
}
};
struct tree *p,*root=new tree();//初始化得注意
void insert(char *str1,char *str2){
p=root;
for(int i=0;i<strlen(str2);i++){
int k=str2[i]-'a';
if(p->next[k]==NULL)
p->next[k]=new tree();
p=p->next[k];
}
p->flage=1;
p->final=(char *)malloc(strlen(str1)*sizeof(char));//数组空间申请,不注意的话会出错,而且很难判断哪里错了。
strcpy(p->final,str1);
}
void translate(char *str){
p=root;
for(int i=0;i<strlen(str);i++){
int k=str[i]-'a';
if(p->next[k]==NULL){
printf("%s",str);//这里得注意,不能break 因为有特殊情况 ,例如 字典中有 fiwo 如果人家输入 fiwoo 这一步如果是break 就会输出 from 而事实应该输出 fiwoo
return ;
}
p=p->next[k];
}
if(p->flage)
printf("%s",p->final);
else
printf("%s",str);
}
int main()
{
char str1[3005],str2[3005];
scanf("%s",str1);
while(!strcmp(str1,"START")&&strcmp(str1,"END"))
while(scanf("%s",str1)&&strcmp(str1,"END")){
scanf("%s",str2);
insert(str1,str2);
}
scanf("%s",str1);
getchar();
while(!strcmp(str1,"START")&&strcmp(str1,"END"))
while(gets(str1)&&strcmp(str1,"END")){
for(int i=0,k=0;i<strlen(str1);i++){
if(str1[i]>'z'||str1[i]<'a'){
str2[k]='\0';
translate(str2);
printf("%c",str1[i]);
k=0;
}
else{
str2[k++]=str1[i];
}
}
printf("\n");
}
return 0;
}