poj 1035 Spell checker【字符串】

大致题意:

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

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++会超时,不知道为什么。有人知道答案给我留言,谢谢!

posted @ 2012-08-01 21:33  小猴子、  阅读(309)  评论(0编辑  收藏  举报