POJ 1035 Spell checker(水~)

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;
}

你可能感兴趣的:(POJ 1035 Spell checker(水~))