Spell checker(poj 1035)

题意:

    此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词。而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3种,第一种是单词种的一个字母写错了,就是和字典中的单词来说只有一个字母不同,第二种是单词多了一个字母,如果去掉该字母,则和字典中的某单词一致。第三种是单词少一个字母,如果添加上该字母,则和字典中的某单词一致。目的是输出这几种错误所对应的字典中的单词。
 
暴力求解超时!!!
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 10010
#define N 15
using namespace std;
char ch[M][N],s[N];
int a[M];
int search(char *a,char *b)
{
    int lena=strlen(a);
    int lenb=strlen(b);
    if(lena==lenb)
    {
        int flag=0;
        for(int i=0;i<lena;i++)
          if(a[i]!=b[i])
            if(!flag) flag=1;
            else return 0;
        if(flag==1)return 1;
    }
    if(lena==lenb+1)
    {
        int pa=0,pb=0,flag=0;
        while(1)
        {
            if(pa>=lena&&pb>=lenb)break;
            if(a[pa]==b[pb])
            {
                pa++;
                pb++;
            }
            else
              if(!flag)
              {
                  flag=1;
                  pa++;
              }
              else return 0;
        }
        if(flag==1)return 1;
    }
    if(lena==lenb-1)
    {
        int pa=0,pb=0,flag=0;
        while(1)
        {
            if(pa>=lena&&pb>=lenb)break;
            if(a[pa]==b[pb])
            {
                pa++;
                pb++;
            }
            else
              if(!flag)
              {
                  flag=1;
                  pb++;
              }
              else return 0;
        }
        if(flag==1)return 1;
    }
    return 0;
}
int main()
{
    int n=0;
    while(1)
    {
        scanf("%s",ch[++n]);
        if(ch[n][0]=='#')
        {
            n--;
            break;
        }
    }
    while(1)
    {
        int flag=0,cnt=0;
        scanf("%s",s);
        if(s[0]=='#')break;
        printf("%s",s);
        for(int i=1;i<=n;i++)
        {
            if(strcmp(s,ch[i])==0)
            {
                printf(" is correct
");
                flag=1;
                break;
            }
            else if(search(s,ch[i]))
              a[++cnt]=i;
        }
        if(!flag)
        {
            printf(":");
            for(int i=1;i<=cnt;i++)
              printf(" %s",ch[a[i]]);
            printf("
");
        }
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/harden/p/5620508.html