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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞