专栏首页饶文津的专栏【POJ 1035】Spell checker

【POJ 1035】Spell checker

题意

  每个单词,如果字典里存在,输出”该单词 is correct“;如果字典里不存在,但是可以通过删除、添加、替换一个字母得到字典里存在的单词,那就输出 “该单词:修正的单词”,并按字典里的顺序输出;如果都不存在,那就输出“单词:”就好。。。

分析

  存下字典单词们和它们的长度,对每个要查找的单词,暴力扫描字典单词,根据单词长度,选择操作并检查。

代码

#include<stdio.h>
#include<cstring>
char c[17],dictionary[10005][17],words[52][17],print[10005];
int n,num,len,correct,l[10005],printlen;
void add(int i)
{
    print[printlen++]=' ';
    for(int p=0; p<l[i]; p++)
        print[printlen+p]=dictionary[i][p];
    printlen+=l[i];
}
int main()
{
    while(scanf("%s",c)&&c[0]!='#')
    {
        for(len=0; c[len]; len++)
            dictionary[num][len]=c[len];
        l[num]=len;
        num++;
    }

    while(scanf("%s",words[n])&&words[n][0]!='#')
    {
        printf("%s",words[n]);
        for(len=0; words[n][len]; len++);
        correct=printlen=0;
        memset(print,0,sizeof(print));
        for(int i=0; i<num&&!correct; i++)
        {
            if(l[i]>=len-1)
            {
                int j=0;
                while(j<len&&dictionary[i][j] ==words[n][j]) j++;
                if(j==len&&l[i]==len)
                    correct=1;
                else
                {
                    if(l[i]==len)
                    {
                        while(j<len&&dictionary[i][j+1] ==words[n][j+1])j++;//替换
                        if(j==len)
                            add(i);
                    }
                    if(l[i]==len-1)
                    {
                        while(j<len-1&&dictionary[i][j] ==words[n][j+1])j++;//删除
                        if(j==len-1)
                            add(i);
                    }
                    if(l[i]==len+1)
                    {
                        while(j<len&&dictionary[i][j+1] ==words[n][j])j++;//添加
                        if(j==len)
                            add(i);
                    }
                }
            }
        }
        if(correct) printf(" is correct\n");
        else printf(":%s\n",print);
        n++;
    }
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【USACO 1.5】Prime Palindromes

    饶文津
  • 【HDU-6148】 Valley Numer(数位dp)

    dfs(当前数位的位置len,这位的数num,是否在上升up,是否有限制limit) limit不用存到状态里,因为limit为true时不可能访问两次。 ...

    饶文津
  • 高精度(正整数的加、减、乘法)

    饶文津
  • 【 BowWow and the Timetable CodeForces - 1204A 】【思维】

    题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的...

    _DIY
  • 基础练习 高精度加法

      由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。   定义一个数组A,A[0]用于存储a的个位,A[1]...

    刘开心_1266679
  • 剑指offer 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 1...

    week
  • hdu1042

    @坤的
  • 【LeetCode02】找出不含重复字符的 最长子串 的长度

    这道题,一开始最直接的想法就是暴力法,直接穷举所有的子串,然后选择无重复的子串中最长的那个。

    Sam Gor
  • HBUOJ 回音排版

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 用awk写递归

    看到自己很多年前写的一篇帖子,觉得有些意义,转录过来,稍加修改。 awk是一种脚本语言,语法接近C语言,我比较喜欢用,gawk甚至可以支持tcp/ip,用起来非...

    窗户

扫码关注云+社区

领取腾讯云代金券