poj 1035 Spell checker

题意:对于给出的一些单词组成字典,然后对于每一个输入的单词检查,有以下几种情况:

1.这个单词在字典里有

2.这个单词删掉任意一个字母能在字典里有

3.这个单词插入任意一个字母能在字典里有

4.这个单词任意一个字母被替换在字典里有

这里可以用string,细心一点,10000个字典单词,50个查询单词,每个单词长度不超过15,那么可以对于每个查询单词暴力遍历判断一次

 

#include <iostream>
#include <string>

using namespace std;

string dic[10005];//字典
string ans[10005];//可能有的答案

int sum,ans_sum;//字典单词数,可能答案数
string str;//临时输入的字符串

void Imput()
{
    sum = 0;
    while(cin >> str)
    {
        if(str == "#") break;
        dic[sum ++] = str;
    }
}

void Print()
{
    cout << str << ':';
    for(int i = 0; i < ans_sum; i ++) cout << ' ' << ans[i];
    cout<<endl;
}

void check()
{
    while(cin >> str)
    {
        if(str == "#") break;

        ans_sum = 0;
        bool should_print = true;//是否要输出,这里对于 is correct 之后就不用后面的Print函数啦

        for(int i = 0; i < sum; i ++)
        {
            if(str == dic[i]){
                cout << str << " is correct" << endl;
                should_print = false;
                break;
            }
            else if(dic[i].length() == str.length()){ //长度相等,则可能有一个字母被替换
                int flag = 0;
                for(int j = 0; j < dic[i].length(); j ++)
                {
                    if(dic[i][j] != str[j]) flag ++;
                }
                if(flag == 1)
                    ans[ans_sum ++] = dic[i];
            }
            else if(dic[i].length() - str.length() == 1){ //在str中插入一个字母,比较
                int flag = 0;
                for(int str_l = 0, dic_l = 0; str_l < str.length() && dic_l < dic[i].length(); )
                {
                    if(str[str_l] == dic[i][dic_l]) str_l ++, dic_l ++;
                    else
                    {
                        dic_l ++;
                        flag ++;
                    }
                }
                if(!flag || flag == 1)
                   ans[ans_sum++] = dic[i];
            }
            else if(str.length() - dic[i].length() == 1){ //删除一个字母
                int flag = 0;
                for(int str_l = 0, dic_l = 0; str_l < str.length() && dic_l < dic[i].length(); )
                {
                    if(str[str_l] == dic[i][dic_l]) str_l ++, dic_l ++;
                    else
                    {
                        str_l ++;
                        flag ++;
                    }
                }
                if(!flag || flag == 1)
                   ans[ans_sum++] = dic[i];
            }
        }
        if(should_print)  Print();
    }
}

int main()
{
    Imput();
    check();
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值