1poj1035(串)

http://poj.org/submit?problem_id=1035

Spell checker
Time Limit: 2000MSMemory Limit: 65536K
Total Submissions: 14115Accepted: 5196

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

题意: 录入字典,然后根据规则(替换一个字符、添加一个字符、删除一个字符)查找单词,注意如果有多个单词符合条件,要按给出的字典顺序输出。
思路是,拿每个带检测字符串和整个字典里的字进行比较,如果有一样的即为correct,如果没有一样的分三种情况:
1.长度相同.
2.带检测字长度比字典里的字少1
3.带检测字长度比字典里的字多1

长度相同时检查不同字符的个数(为1时即可以替换),长度不同时拿较短的字去匹配较长的字,较短字每个字符在较长字中的位置存放在一个数组里,匹配完成后,扫描数组看是否为递增的,并且每一个字符都在较长字中出现。
感觉这题太妙了。看了很多人写的代码感觉神人太多了。做题首先最重要的是思路。这题就是1首先输入字典,要不要排序呢?——不要,因为输出的时候要按照给的字典顺序。2每读入一个单词就进行比较,这是管用的。要不要给每个输入的单词排序呢?——不要这不是字母重排。3就是核心算法了。首先我们要考虑的是单词和字典里的单词长度是否<=1。其他的不要考虑。相同简单遍历一下。差一的话就复杂点,详细的看代码
 
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int work1(char s1[],char s2[])//这边要好好理解下判断是否多加了或少加了字母

{
 int index=-1,i,count=0;
 for(i=0;i<strlen(s1);i++)//处理的太妙了
 {
  ++index;
  if(s1[i]!=s2[index])
  {
   ++count;
   --index;
   if(count>1)
    return 0;
  }
 }
 return 1;
}
int work2(char s1[],char s2[])//判断是否拼写错误
{
 int k,count=0;
 for(k=0;k<strlen(s1);k++)
 {
  if(s1[k]!=s2[k])
  {
   count++;
   if(count>1)
    return 0;
  }
 }
 return 1;
}
int main()
{
 //freopen("text.txt","r",stdin);
 int i,j,sign;
 char str[10001][20];
 char s[20];
 i=0;
 for(;;)
 {
  scanf("%s",&str[i]);
  if(str[i][0]=='#')
   break;
  i++;
 }
 while(1)
 {
  scanf("%s",s);
  if(strcmp(s,"#")==0)
   break;
  sign=1;
  for(j=0;j<i;j++)
  {
   if(strcmp(s,str[j])==0)
   {
    sign=0;
    printf("%s is correct\n",s);
    break;
   }
  }
  if(sign)
  {
   printf("%s:",s);
   for(j=0;j<i;j++)
   {
    if(strlen(s)==strlen(str[j]))
    {
     if(work2(s,str[j]))
     {
      printf(" %s",str[j]);
     }
    }
    else if(strlen(s)-strlen(str[j])==1)//这个和下面那个是一样的可以合并(把长度大的放在前面)
    {
     if(work1(s,str[j]))
     {
      printf(" %s",str[j]);
     }
    }
    else if(strlen(str[j])-strlen(s)==1)
    {
     if(work1(str[j],s))
     {
      printf(" %s",str[j]);
     }
    }
   }
   printf("\n");
  }
 }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值