poj 1035 Spell checker【字符串】

本文介绍了一种使用C++实现的字典匹配算法,该算法能够根据输入的单词查找字典中的匹配项,包括完全匹配、单字符差异匹配及通过增删一个字符后的匹配。并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大致题意:

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

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

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

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

View Code
#include<stdio.h>
#include<string>
#include<vector>
#include<iostream>
using namespace std;

vector<string> vec;

bool is_equal(string a, string b) //判断两个串是否相等。
{
    if(a == b) {
        cout << a << " is correct\n";
        return 1;
    }
    return 0;
}

void change(string a, string b) //改变一个字符是否相等。
{
    int len = a.length();
    int n = 0;
    for(int i = 0; i < len; i++) {
        if(a[i] != b[i]) {
            n++;
        }
        if(n > 1) return;
    }
    cout << " " << b;
}

void change1(string a, string b, bool mark) //判断增加一个字符或减少一个字符是否相等。
{
    int len = a.length();
    for(int i = 0; i < len; i++) {
        if(a[i] != b[i]) {
            string temp = a;
            temp.erase(i, 1);
            if(temp == b && mark) {
                cout << " " << b;
            } else if(temp == b && !mark){
                cout << " " << a;
            } else {
                return ;
            }
        }
    }
}

int main()
{
    string str;
    while(cin >> str) {
        if(str == "#") break;
        vec.push_back(str);
    }

    int n = vec.size();
    while(cin >> str) {
        if(str == "#") break;

        bool bl = 0;
        for(int i = 0; i < n; i++) {
            bl = is_equal(str, vec[i]);
            if(bl) break;
        }
        if(bl) continue;

        cout << str << ":";
        int len = str.length();
        for(int i = 0; i < n; i++) {
            int vlen = vec[i].length();
            if(len == vlen) {
                change(str, vec[i]);
            } else if(len == vlen + 1) {
                change1(str, vec[i], 1); 
            } else if(vlen == len + 1) {
                change1(vec[i], str, 0);
            }
        }
        cout << endl;
    }
    return 0;
}

注意:用C++提交,G++会超时,不知道为什么。有人知道答案给我留言,谢谢!

转载于:https://www.cnblogs.com/-hsz/archive/2012/08/01/2619050.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值