• 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;
    }
  • 相关阅读:
    ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference
    springboot-32-使用mvc测试
    docker-dockerfile使用
    java-jmx使用
    docker-使用ali云加速
    docker-基础命令
    centos7-使用nginx做ftp站
    maven-插件-不同的开发环境指定
    maven
    mysql-定时对表分区
  • 原文地址:https://www.cnblogs.com/tanhehe/p/2989854.html
Copyright © 2020-2023  润新知