您的位置:首页 > 其它

POJ 1035 Spell checker(水~)

2015-06-20 11:44 477 查看
Description

输入一部字典,输入若干单词

1、 若某个单词能在字典中找到,则输出corret

2、 若某个单词能通过变换或删除或添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据 输入的那部字典的字典序

3、 若某个单词无论操作与否都无法在字典中找得到,则输出空

Input

一部字典,以#结束字典输入,多次单词查询,以#结束输入

Output

对每一个查询的单词,按题意输出

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

Solution

字符串处理

对于每个查询的单词,对字典中单词逐个比较,只有当两者长度差<=1的时候才检查操作

Code

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<string>s;
int main()
{
string c;
while(1)//输入字典
{
cin>>c;
if(c=="#")
break;
else
s.push_back(c);
}
while(1)//多次查询
{
cin>>c;
if(c=="#")
break;
cout<<c;//按格式输出
int flag=0;
for(int i=0;i<s.size();i++)//找到相同单词
if(c==s[i])
flag=1;
if(flag)
{
cout<<" is correct"<<endl;
continue;
}
cout<<": ";//按格式输出
for(int i=0;i<s.size();i++)//检查字典中每个单词
{
int t=s[i].length()-c.length();
if(t<-1||t>1)//长度差>1,不符合条件
continue;
if(t==0)//若长度相同则判断是否只相差一个字符
{
int res=0;//不同的字符个数
for(int j=0;j<s[i].length();j++)
if(s[i][j]!=c[j])
res++;
if(res==1)//若只相差一个字符则满足条件
cout<<s[i]<<" ";//按格式输出
}
else if(t==-1||t==1)//若长度相差一则判断是否只增添或删减了一个字符
{
if(t==1)//删减一个字符
{
int res=0;//相同的字符数
for(int j=0;j<s[i].size();j++)
if(s[i][j]==c[res])
res++;
if(res==c.size())//满足条件
cout<<s[i]<<" ";//按格式输出
}
if(t==-1)//增添一个字符
{
int res=0;//相同的字符数
for(int j=0;j<c.size();j++)
if(s[i][res]==c[j])
res++;
if(res==s[i].size())//满足条件
cout<<s[i]<<" ";//按格式输出
}
}
}
cout<<endl;//按格式输出
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: