• poj 1035 Spell checker ( 字符串处理 )


    Spell checker
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 16675   Accepted: 6087

    Description

    You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their forms.
    If the word is absent in the dictionary then it can be replaced by correct words (from the dictionary) that can be obtained by one of the following operations:
    ?deleting of one letter from the word;
    ?replacing of one letter in the word with an arbitrary letter;
    ?inserting of one arbitrary letter into the word.
    Your task is to write the program that will find all possible replacements from the dictionary for every given word.

    Input

    The first part of the input file contains all words from the dictionary. Each word occupies its own line. This part is finished by the single character '#' on a separate line. All words are different. There will be at most 10000 words in the dictionary.
    The next part of the file contains all words that are to be checked. Each word occupies its own line. This part is also finished by the single character '#' on a separate line. There will be at most 50 words that are to be checked.
    All words in the input file (words from the dictionary and words to be checked) consist only of small alphabetic characters and each one contains 15 characters at most.

    Output

    Write to the output file exactly one line for every checked word in the order of their appearance in the second part of the input file. If the word is correct (i.e. it exists in the dictionary) write the message: " is correct". If the word is not correct then write this word first, then write the character ':' (colon), and after a single space write all its possible replacements, separated by spaces. The replacements should be written in the order of their appearance in the dictionary (in the first part of the input file). If there are no replacements for this word then the line feed should immediately follow the colon.

    Sample Input

    i
    is
    has
    have
    be
    my
    more
    contest
    me
    too
    if
    award
    #
    me
    aware
    m
    contest
    hav
    oo
    or
    i
    fi
    mre
    #

    Sample Output

    me is correct
    aware: award
    m: i my me
    contest is correct
    hav: has have
    oo: too
    or:
    i is correct
    fi: i
    mre: more me

    Source

     
     
    题意:给一个字典,给一些词。判断这些词是否拼写正确。就是如果在字典里找到了这个词就是正确,输出" %s(这个词) is correct"。如果没找到,就判断字典里有没有
               和这个词接近的,输出这些词。接近有三层意思:1、可以是在这个词里增加任意一个字母,判断字典里是否存在这个新单词。2、可以是去掉任意一个字母,判断字
               典里是否存在这个新单词。3、可以是任意改变其中的一个字母,找字典里有无这个新单词。碰到接近的词就记录下来,这是输入中词可能拼错的正确写法。按题意
               输出即可。(就是个判词系统)
    分析:模拟+暴力!增加一个字母判断有无这个词,前提是这个词比字典里正确的词少一个字母且其余的字母都相同。同理,减少一个字母,前提这个词比字典里正确的词
               多一个字母且其余的字母都相同。改动一个词,要求待判断的词与正确的词长度相同且只有一个字母不一样。在字典里找得到输入词的情况直接用strcmp()。
    感想:输入的写法需要注意。用new动态内存分配不怎么熟悉啊。。。。囧~!!!还有要记得delete释放空间。。
     
    据说这题还可以用字典树写。可惜我还要先学 “字典树”~!
     
    代码:
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    
    char dict[10005][20];
    char word[55][20];
    int dictnum,wordnum;
    
    void Input()
    {
        while(scanf("%s",&dict[dictnum])&&dict[dictnum++][0]!='#');
        while(scanf("%s",&word[wordnum])&&word[wordnum++][0]!='#');
        dictnum--;              //剔除“#”
        wordnum--;
    }
    
    bool Change(char *dict,char *word)
    {
        int dif=0;
        while(*word)
        {
            if(*(word++)!=*(dict++))
            {
                dif++;
                if(dif>1)
                    return false;
            }
        }
        return true;
    }
    
    bool Add(char *dict,char *word)
    {
        int dif=0;
        while(*dict)
        {
            if(*dict!=*word)
            {
                dict++;
                dif++;
                if(dif>1)
                    return false;
            }
            else
            {
                dict++;
                word++;
            }
        }
        return true;
    }
    
    bool Del(char *dict,char *word)
    {
        int dif=0;
        while(*word)
        {
            if(*word!=*dict)
            {
                word++;
                dif++;
                if(dif>1)
                    return false;
            }
            else
            {
                word++;
                dict++;
            }
        }
        return true;
    }
    
    int main()
    {
        Input();
        int *dictlen=new int[dictnum];
        for(int i=0;i<dictnum;i++)
            dictlen[i]=strlen(dict[i]);
        for(int j=0;j<wordnum;j++)
        {
            int len=strlen(word[j]);
            int *address=new int[dictnum];
            int pa=0;
            int flag=false;
    
            for(int k=0;k<dictnum;k++)
            {
                if(len==dictlen[k])
                {
                    if(strcmp(dict[k],word[j])==0)
                    {
                        flag=true;
                        break;
                    }
                    else if(Change(dict[k],word[j]))
                        address[pa++]=k;
                }
                else if(len-dictlen[k]==1)
                {
                    if(Del(dict[k],word[j]))
                        address[pa++]=k;
                }
                else if(dictlen[k]-len==1)
                {
                    if(Add(dict[k],word[j]))
                        address[pa++]=k;
                }
            }
            if(flag)
                printf("%s is correct
    ",word[j]);
            else
            {
                printf("%s: ",word[j]);
                for(int d=0;d<pa;d++)
                    printf("%s ",dict[address[d]]);
                printf("
    ");
            }
            delete address;
        }
        return 0;
    }
    

     

    11933189

    fukan

    1035

    Accepted

    424K

    94MS

    C++

    2480B

    2013-08-06 20:36:48

     
  • 相关阅读:
    不应滥用named let
    PAT甲级——A1106 Lowest Price in Supply Chain
    PAT甲级——A1105 Spiral Matrix【25】
    PAT甲级——A1104 Sum of Number Segments
    PAT甲级——A1103 Integer Factorization
    PAT甲级——A1102 Invert a Binary Tree
    PAT甲级——A1101 Quick Sort
    PAT甲级——A1100 Mars Numbers
    PAT甲级——A1099 Build A Binary Search Tree
    PAT甲级——A1098 Insertion or Heap Sort
  • 原文地址:https://www.cnblogs.com/pangblog/p/3243795.html
Copyright © 2020-2023  润新知