poj 1035 Spell checker trie树+快排

很恶心的一道题。。。

思想很简单的,就是找一个单词是否在字典中出现过,出现了则按题意输出。如果没出现,则在某个位置插入或删除或替代某个字符,然后判断在字典中是否出现。

我用的字典树,还没用STL里的map尝试,代码量会稍大些。

有几个恶心的地方:输出时按在字典中出现的顺序输出,即删除或插入或替代操作后有多个答案时按input里单词的输入先后顺序依次输出;插入时注意可以往单词末尾插入;注意判重,去掉可能的相同单词的情况。。。

这题还是借鉴discuss里的方法敲出来的,相似度也有点高。囧。。。

/*Memory: 13728K		Time: 79MS
Language: C++		Result: Accepted
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct node{  //记录结果
	char str[20];  
	int index;
}ans[10010];

struct Trie{
	Trie *br[26];
	int index;
	void init(){
		index=0;
		for(int i=0;i<26;++i)
			br[i]=NULL;
	}
}*root,tree[150010];

int p;
void build(char *s,int idx)
{
	Trie *t=root;
	for(int i=0;s[i];++i){
		int id=s[i]-'a';
		if(!t->br[id]){
			tree[++p].init();
			t->br[id]=&tree[p];
		}
		t=t->br[id];
	}
	t->index=idx;  //记录单词是第几个输入的
}

int search(char *s)
{
	Trie *t=root;
	for(int i=0;s[i];++i){
		int id=s[i]-'a';
		if(!t->br[id])	return 0;
		t=t->br[id];
	}
	return t->index;	
}

void repla(char *from,char *to,int pos,char c)
{ //替代某个字符
	strcpy(to,from);
	to[pos]=c;	
}

void insert(char *from,char *to,int pos,char c)
{ //插入某个字符
	int len=strlen(from);
	for(int i=0;i<pos;++i)
		to[i]=from[i];
	to[pos]=c;
	for(int i=pos;i<len;++i)
		to[i+1]=from[i];
	to[len+1]='\0';
}

void delet(char *from,char *to,int pos)
{ //删除某个字符
	int len=strlen(from);
	for(int i=0;i<pos;++i)
		to[i]=from[i];
	for(int i=pos;i<len-1;++i)
		to[i]=from[i+1];
	to[len-1]='\0';
}

int cmp(const node &a,const node &b)
{
	return a.index<b.index;
}

int main()
{
	tree[0].init();
	root=&tree[0];
	char str[20],temp[20];
	int idx=1;
	while(scanf("%s",str),str[0]!='#'){
		build(str,idx++);
	}
	while(scanf("%s",str),str[0]!='#'){
		if(search(str))	printf("%s is correct\n",str);
		else{
			int len=strlen(str);
			int x,cnt=0;
			for(int i=0;i<len;++i){
				delet(str,temp,i);
				if((x=search(temp))!=0){
					strcpy(ans[cnt].str,temp);
					ans[cnt++].index=x;
				}
				for(int j=0;j<26;++j){
					repla(str,temp,i,j+'a');
					if((x=search(temp))!=0){
						strcpy(ans[cnt].str,temp);
						ans[cnt++].index=x;
					}
					insert(str,temp,i,j+'a');
					if((x=search(temp))!=0){
						strcpy(ans[cnt].str,temp);
						ans[cnt++].index=x;
					}
				}
			}
			for(int i=0;i<26;++i){
				insert(str,temp,len,i+'a');
				if((x=search(temp))!=0){
					strcpy(ans[cnt].str,temp);
					ans[cnt++].index=x;
				}
			}
			sort(ans,ans+cnt,cmp);//排序,保证结果按输入顺序输出
			printf("%s:",str);
			if(cnt)	printf(" %s",ans[0].str);
			for(int i=1;i<cnt;++i)  //判重
				if(ans[i].index!=ans[i-1].index)
					printf(" %s",ans[i].str);
			puts("");
		}
	}
	return 0;
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/caobo1212/article/details/7976950
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞