【暑假集训】拼写检查

14 篇文章 3 订阅
12 篇文章 0 订阅

【问题描述】

   作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性。
   如果字典中没有这个词,那么可以用下列操作中的一个来替换正确的单词(从字典中):
   1. 从单词中删除一个字母;
   2. 用一个任意字母替换单词中的一个字母;
   3. 在单词中插入一个任意字母。
   你的任务是编写一个程序,为每个给定的单词找到字典中所有可能的替换。
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<vector>
#include<map>
#include<set>
#include<cmath>
using namespace std;

//maintain the element
set<string>maintain;
//store the element and make it oredered by the entry sequence
vector<string>dictionary;

bool eraseOperate(string first, string second)
{
    if( abs ( int( first.size() - second.size() ) ) != 1)return false;   
    //make sure first size is bigger than the second
    if(first.size() < second.size() ) 
        swap(first,second);
    int firstSize = first.size() ; int secondSize = second.size();
    string tmp = first;
    for(int i = 0 ; i < firstSize ; i ++)
    {
        tmp.erase(i,1);
        if(tmp == second)return true;
        tmp = first;
    }
    return false;
}

bool replaceOperate(string first,string second)
{
    int firstSize = first.size() ; int secondSize = second.size();
    if(firstSize != secondSize )return false;
    int count = 0;
    for(int i = 0 ; i < firstSize ; i++)
    {
        if( first[i]!= second[i] )count++;
    }
    return ( count == 1 );
}

int main()
{
    string dict;
    while(cin>>dict && dict[0] !='#')
    {
        dictionary.push_back(dict);
        maintain.insert(dict);
    }
    string word;
    while(cin>>word && word[0] != '#')
    {
        if(maintain.find(word) != maintain.end() )
        {
            cout<<word<<" is correct"<<endl;
        }
        else{
            cout<<word<<": ";
            for(auto& v : dictionary)
            {
                if(replaceOperate(v,word) || eraseOperate(v,word) )
                {
                    cout<<v<<" ";
                }
            }
            cout<<endl;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值