POJ1035 Spell checker

 

题目链接

分析:

对于该题,使用的是字典树。暴力。不过一开始忽略了个问题:

对于第三个inserting of one arbitrary letter into the word.

忽略了一种情况。那就是有字符串中含有相邻的相同字符。例如,aab,

在0号插入a和1号插入a,新得到的字符串都是aaab。在输出时注意下就行了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct TrieNode{
    int flag, order;
    struct TrieNode *next[27];
}TrieNode;

struct Node{
    char s[20];
    int order;
}ans[10010];

int cnt;

TrieNode *CreateTrieNode(){
    TrieNode *p;
    int i;
    p = (TrieNode *)malloc(sizeof(TrieNode));
    p->flag = 0; p->order = 0;
    for(i=0; i<26; i++) p->next[i] = NULL;
    return p;
}

void Insert(TrieNode **T, char *s){
    TrieNode *p;
    int i, len, k;
    if(!(p = (*T))) p = (*T) = CreateTrieNode();
    len = strlen(s);
    for(i=0; i<len; i++){
        k = s[i] - 'a';

        if(!p->next[k]) p->next[k] = CreateTrieNode();
        p = p->next[k];
    }
    p->flag = 1;
    p->order = cnt++;
}

int search(TrieNode *T, char *s){
    TrieNode *p = T;
    int i, len, k;
    len = strlen(s);
    for(i=0; i<len; i++){
        k = s[i] - 'a';
        if(!p->next[k]) return 0;
        p = p->next[k];
    }
    if(p->flag){
        ans[cnt].order = p->order;
        strcpy(ans[cnt++].s, s);
        return 1;
    }
    else return 0;
}

int cmp(const void *a, const void *b){
    struct Node x = *(struct Node *)a, y = *(struct Node *)b;
    return x.order - y.order;
}

int main(){
    TrieNode *T = NULL;
    char s[20], s1[20];
    int i, len, j, k, flag;

    cnt = 0;
    while(scanf("%s", s) == 1 && s[0] != '#'){
        Insert(&T, s);
    }
    while(scanf("%s", s) == 1 && s[0] != '#'){
        if(search(T, s)) printf("%s is correct\n", s);
        else{
            flag = 1;
            cnt = 0;
            len = strlen(s);
            for(i=0; i<len; i++) if(!(s[i] >= 'a' && s[i] <= 'z')){flag = 0; break;}
            for(i=0; i<len && flag; i++){
                j = k = 0;
                while(j<len-1){
                    if(i==k){k++; continue;}
                    s1[j++] = s[k++];
                }
                s1[j] = '\0';
                search(T, s1);
            }


            for(i=0; i<len && flag; i++){
                strcpy(s1, s);
                for(j=0; j<26; j++){
                    s1[i] = j+'a';
                    search(T, s1);
                }
            }


            for(i=0; i<len+1 && flag; i++){
                for(j=0; j<26; j++){
                    strcpy(s1, s);
                    for(k=len+1; k>i; k--){
                        s1[k] = s1[k-1];
                    }
                    s1[k] = j+'a';
                    search(T, s1);
                }
            }

            qsort(ans, cnt, sizeof(ans[0]), cmp);
            printf("%s:", s);
            for(i=0; i<cnt && flag; i++){
                if(i != cnt-1 && strcmp(ans[i].s, ans[i+1].s) == 0) continue;
                else printf(" %s", ans[i].s);
            }
            putchar('\n');
        }
    }

    return 0;
}

 

posted on 2013-03-29 23:35  Still_Raining  阅读(157)  评论(0编辑  收藏  举报