Spell checker(poj 1035)

题意:

此题是一个字符串的问题,首先要给出一个字典,里面存储了数个单词。而后,给出一个单词,如果字典中存在,那么就输出correct,如果字典中没有,那么就要判断是不是这个单词有错误,错误有3种,第一种是单词种的一个字母写错了,就是和字典中的单词来说只有一个字母不同,第二种是单词多了一个字母,如果去掉该字母,则和字典中的某单词一致。第三种是单词少一个字母,如果添加上该字母,则和字典中的某单词一致。目的是输出这几种错误所对应的字典中的单词。

暴力求解超时!!!

#include<cstdio>
#include<iostream>
#include<cstring>
#define M 10010
#define N 15
using namespace std;
char ch[M][N],s[N];
int a[M];
int search(char *a,char *b)
{
    int lena=strlen(a);
    int lenb=strlen(b);
    if(lena==lenb)
    {
        int flag=0;
        for(int i=0;i<lena;i++)
          if(a[i]!=b[i])
            if(!flag) flag=1;
            else return 0;
        if(flag==1)return 1;
    }
    if(lena==lenb+1)
    {
        int pa=0,pb=0,flag=0;
        while(1)
        {
            if(pa>=lena&&pb>=lenb)break;
            if(a[pa]==b[pb])
            {
                pa++;
                pb++;
            }
            else
              if(!flag)
              {
                  flag=1;
                  pa++;
              }
              else return 0;
        }
        if(flag==1)return 1;
    }
    if(lena==lenb-1)
    {
        int pa=0,pb=0,flag=0;
        while(1)
        {
            if(pa>=lena&&pb>=lenb)break;
            if(a[pa]==b[pb])
            {
                pa++;
                pb++;
            }
            else
              if(!flag)
              {
                  flag=1;
                  pb++;
              }
              else return 0;
        }
        if(flag==1)return 1;
    }
    return 0;
}
int main()
{
    int n=0;
    while(1)
    {
        scanf("%s",ch[++n]);
        if(ch[n][0]==‘#‘)
        {
            n--;
            break;
        }
    }
    while(1)
    {
        int flag=0,cnt=0;
        scanf("%s",s);
        if(s[0]==‘#‘)break;
        printf("%s",s);
        for(int i=1;i<=n;i++)
        {
            if(strcmp(s,ch[i])==0)
            {
                printf(" is correct\n");
                flag=1;
                break;
            }
            else if(search(s,ch[i]))
              a[++cnt]=i;
        }
        if(!flag)
        {
            printf(":");
            for(int i=1;i<=cnt;i++)
              printf(" %s",ch[a[i]]);
            printf("\n");
        }
    }
    return 0;
}

时间: 2024-10-12 07:26:16

Spell checker(poj 1035)的相关文章

POJ 1035 Spell checker (串)

题目大意: 问你后面输入的串能不能通过  加减一个字符,或者替换一个字符变成字典中的串. 思路分析: 直接模拟替换加减的过程. 比较两个串的长度.要相差为1 的时候才能进行模拟. 模拟的过程就是进行一个个的匹配. 发现失配的次数小于等于 1就可以输出. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <string> #i

poj 1035 Spell checker(暴力判断)

题目链接:http://poj.org/problem?id=1035 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their f

POJ 1035 Spell checker (模拟)

题目链接 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their forms. If the word is absent in

[ACM] POJ 1035 Spell checker (单词查找,删除替换增加任何一个字母)

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

【POJ】1035 Spell checker

字典树. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <string> 7 using namespace std; 8 9 typedef struct Trie { 10 int in; 11 Trie *next[26]; 12 } Trie;

[ACM] POJ 1035 Spell checker (单词查找,删除替换添加不论什么一个字母)

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

Spell checker POJ 1035 字符串

Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25426   Accepted: 9300 Description You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given word

POJ 1035 Spell Check 字符串处理

被这样的题目忽悠了,一开始以为使用Trie会大大加速程序的,没想到,一不小心居然使用Trie会超时. 最后反复试验,加点优化,终于使用Trie是可以过的,不过时间大概难高于1500ms,一不小心就会超时. 看来这是一道专门卡Trie的题目,只好放弃不使用Trie了. 也得出点经验,如果字符串很多,如本题有1万个字符串的,那么还是不要使用Trie吧,否则遍历一次这样的Trie是十分耗时的,2s以上. 于是使用暴力搜索法了,这里的技巧是可以使用优化技术: 1 剪枝:这里直接分组搜索,分组是按照字符串

poj1035(Spell checker)

题目地址:Spell checker 题目大意: 给你一个关于字符串的字典,让你根据字典里的字符串判断输入字符串的正确性.如果字符串不正确,可以通过以下的操作来输出字符串的可能性:1.可以替换一个字符,2.可以删除一个字符,3.可以添加一个字符.如果满足以上操作,说明都算是字符串的可能性,然后输出. 解题思路: 判断四种情况即可,如果正确直接输出,如果出现1.2.3这几种情况,先将字符串存到一个字符数组里s[N][N].如果全部判断完,没有正确性,输出可能性的字符串. 代码: 1 #includ