POJ1035 Spell checker 字符串模拟

题目大意:先输入一个词典(以#号结束),词典中的每个词条为一个字符串,然后有不定次询问(询问也以#号结束),每次询问是给出一个字符串c,问你在不在词典中,如果在,输出“c is correct”;如果不在,做下列3种操作:(1)改变c中的一个字符;(2)删除c中的一个字符;(3)在c中增加一个字符;如果c在完成以上操作后变成了词典中有的字符串,那么就把改变后的c输出,如果没有,原样输出c。其中,所有的字符串长度不超过15且都为小写字母。



分析:比较简单的字符串模拟题。字符串的长度都很小,暴力就OK。

用一个二维数组把词典纪录下来,同时纪录下来每个词条的长度,对于每一次询问,可以先遍历词典看c是否在词典中,如果在,直接输出,然后进行下一次询问。如果不在,那么对于这3种操作:操作(1)就是在长度和c相等的词条中,找出和c的对应位字符只有一个不等的词条输出即可;操作(2)和(3)其实就是判断在长度和c相差为1的词条中,两个字符串之间是否存在字串和母串的关系。


实现代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char dic[10010][20];
int len[10010];
int main()
{
    char c[20];
    int num=0,cnt;
    bool flag;
    while(cin>>c&&c[0]!='#')
    {
        strcpy(dic[num],c);
        len[num++]=strlen(c);
    }
    while(cin>>c&&c[0]!='#')
    {
        flag=1;
        for(int i=0;i<num;i++)
          if(strcmp(dic[i],c)==0)
          {
              printf("%s is correct\n",c);
              flag=0;
              break;
          }
        if(!flag)
        {
            flag=1;
            continue;
        }
        int lenc=strlen(c);
        printf("%s:",c);
        for(int i=0;i<num;i++)
        {
            if(lenc==len[i])
            {
                cnt=0;
                for(int j=0;j<lenc;j++)
                  if(c[j]!=dic[i][j]) cnt++;
                if(cnt==1) printf(" %s",dic[i]);
            }
            else if(lenc-len[i]==1)
            {
                cnt=0;
                for(int j=0;j<lenc;j++)
                  if(c[j]==dic[i][cnt]) cnt++;
                if(cnt==len[i]) printf(" %s",dic[i]);
            }
            else if(len[i]-lenc==1)
            {
                cnt=0;
                for(int j=0;j<len[i];j++)
                  if(c[cnt]==dic[i][j]) cnt++;
                if(cnt==lenc) printf(" %s",dic[i]);
            }
        }
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(POJ1035 Spell checker 字符串模拟)