`
Coco_young
  • 浏览: 125756 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

POJ_1035_水题_字符串

阅读更多
题目链接:
http://poj.org/problem?id=1035




思路是,拿每个带检测字符串和整个字典里的字进行比较,如果有一样的即为correct,如果没有一样的分三种情况:
1.长度相同.
2.带检测字长度比字典里的字少1
3.带检测字长度比字典里的字多1

长度相同时检查不同字符的个数(为1时即可以替换),长度不同时拿较短的字去匹配较长的字,较短字每个字符在较长字中的位置存放在一个数组里,匹配完成后,扫描数组看是否为递增的,并且每一个字符都在较长字中出现。

#include<stdio.h>
#include<string.h>
#define SIZE 11000
char dic[SIZE][20];
int cnt;
void read_dic()//读取字典
{
     cnt = 0;
     while(scanf("%s%*c",dic[cnt]))
     {
        if(dic[cnt][0]=='#')
        break;
        else
        cnt++;
     }
}
bool isCor(char *str)//是否正确 
{
     int i;
     for(i=0;i<cnt;i++)
     if(strcmp(dic[i],str)==0)return true;
     return false;
} 
void Replace(char *str)//替换
{
     printf("%s:",str);
     int i,j,k,arr[20],diff,isSort;
     int ls = strlen(str),ld;
     for(i=0;i<cnt;i++)
     {
        ld = strlen(dic[i]);
        if(ls==ld)//如果长度相同 
        {
            diff = 0;
            for(j=0;j<ld;j++)
            {
               if(str[j]!=dic[i][j]) diff++;
            }
            if(diff==1)printf(" %s",dic[i]);
        }
        else if(ls==ld+1)//delete
        {
            memset(arr,-1,sizeof(arr));
            for(j=0;j<ld;j++)
            {
               for(k=j==0?0:arr[j-1]+1;k<ls;k++)
               {
                  if(str[k]==dic[i][j])
                  {
                      arr[j] = k;
                      break;
                  }
               }
            }
            isSort = 1;
            //检查arr是否有序
            for(j=0;j<ld-1;j++)
            {
               if(arr[j+1]<arr[j]||arr[j]==-1)
               {
                  isSort = 0;
                  break;
               }
            } 
            if(arr[ld-1]==-1)isSort = 0;
            if(isSort)printf(" %s",dic[i]);
        }
        else if(ls+1==ld)//add
        {
            memset(arr,-1,sizeof(arr));
            for(j=0;j<ls;j++)
            {
               for(k=j==0?0:arr[j-1]+1;k<ld;k++)
               {
                  if(str[j]==dic[i][k])
                  {
                      arr[j] = k;
                      break;
                  }
               }
            }
            isSort = 1;
            //检查arr是否有序
            for(j=0;j<ls-1;j++)
            {
               if(arr[j+1]<arr[j]||arr[j]==-1)
               {
                  isSort = 0;
                  break;
               }
            } 
            if(arr[ls-1]==-1)isSort = 0;
            if(isSort)printf(" %s",dic[i]);
        }
     }
} 
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    read_dic();
    char str[20];
    while(scanf("%s%*c",str),str[0]!='#')
    {
        if(isCor(str))
        printf("%s is correct\n",str);
        else
        {
           Replace(str);
           printf("\n");
        }
    }
}

  • 大小: 15.5 KB
分享到:
评论

相关推荐

    ACM.zip_ACM_poj_poj3187_poj3669

    题目poj3187和poj3669涉及的具体内容无法直接得知,但根据ACM竞赛的特点,它们可能涉及经典的算法问题,如动态规划、贪心算法、图论、字符串处理、排序算法等。 描述中提到“已经测试过可以通过oj”,这意味着提供...

    string-problem(POJ).rar_POJ 19_poj

    标题中的"string-problem(POJ).rar_POJ 19_poj"表明这是一个与ACM编程竞赛相关的压缩包,特别关注的是字符串处理问题。在ACM编程竞赛中,字符串问题是一个常见的类别,通常涉及到字符串的查找、比较、操作、模式匹配...

    北京大学_POJ_ACM解题报告

    5. **字符串处理**:KMP算法、Z算法、Manacher算法等,用于高效地处理字符串匹配问题。 6. **数学应用**:组合数学、数论、模运算、动态规划中的数学思想等,ACM竞赛中数学素养的重要性不言而喻。 7. **编码技巧**...

    POJ1035-Spell checker 测试数据

    5. **字符串操作**:编程解决问题时,需要对输入的字符串进行分析、比较和转换,这通常涉及到字符串的遍历、分割、查找等基本操作。 6. **测试数据**:在编程竞赛中,测试数据用于验证程序的正确性,包括边界情况、...

    poj题目代码

    4. poj_1080.c - "Multiplication Table":该题要求生成乘法表,是基础的字符串处理和循环控制的应用,适合巩固基础知识。 5. poj_1002.c - "Addition":这是最基础的加法问题,虽然简单,但却是所有计算的基础,...

    POJ100题_C++_源码

    【标题】"POJ100题_C++_源码" 涉及的是C++编程语言在解决算法竞赛中的应用,尤其是针对POJ(Programming Online Judge)平台上的编程题目。POJ是一个在线的编程练习系统,它提供了一系列的算法问题供用户练习,提升...

    POJ水题代码(C++)请合理使用

    ### POJ水题代码(C++)请合理使用 #### POJ 1000:简单加法 **知识点:** 1. **基本输入输出操作:**本题主要涉及到基础的输入输出,通过`Readln(a,b);`读取两个整数,并通过`Writeln(a+b);`输出它们的和。 2. **...

    poj水题(给初学者的练手的)

    5. **1008** - 可能是一个简单的字符串处理题目,比如字符串翻转等。 6. **3299** - 可能是一个关于递归或迭代的应用题,帮助理解递归的基本概念。 7. **2159** - 可能涉及简单的贪心算法应用。 8. **2739** -...

    poj部分水题代码

    根据提供的文件信息,我们可以从中...以上四个题目覆盖了不同的编程技巧和算法思想,如条件判断、循环结构、数学计算及字符串操作等。对于初学者来说,这些题目不仅能够帮助他们巩固基础知识,还能提升解决问题的能力。

    POJ1035-Spell checker

    总的来说,"POJ1035 - Spell checker"不仅是一道编程题目,也是一次对字符串处理、错误检测、算法设计和实现能力的综合检验。参与这样的练习有助于提升编程技能,特别是对于解决实际问题和优化性能的思考。通过阅读...

    POJ1159-Palindrome

    【标签】"POJ 1159 Palindrome" 标签明确了这是关于回文的一个问题,回文是指正读反读都能读通的字符串,例如"madam"或"12321"。在编程中,回文的检测是字符串处理的基本操作,常常涉及字符串反转和比较。 **知识点...

    POJ1016-Numbers That Count【字符串处理】

    《POJ1016-Numbers That Count:深入解析字符串处理》 在编程竞赛的世界里,北京大学的在线判题系统POJ(Problem Online Judge)是一个备受程序员喜爱的平台。其中,POJ1016“Numbers That Count”是一个涉及字符串...

    poj acm300题 c++源码打包

    5. **字符串处理**:KMP算法、Boyer-Moore算法、Rabin-Karp算法等字符串匹配方法。 6. **位运算**:利用位运算进行高效计算,如快速幂、异或操作等。 7. **优化技巧**:如代码优化、内存管理、预处理指令、递归...

    西工大poj100题

    【标签】"c语言100题"表明这个压缩包的内容是关于C语言编程的实践题目,涵盖了C语言的基础语法、控制结构、函数、指针、数组、字符串、结构体等核心概念。通过解答这些题目,学习者可以巩固理论知识,提高实际编程...

    POJ1000-1299中的80题AC代码

    这些编号通常对应着POJ上的题目ID,每个ID后面可能代表一个特定的算法或编程问题,如排序、搜索、图论、动态规划、字符串处理、数学问题等。具体到每一个题目,其可能涉及的知识点包括: 1. **基础数据结构**:数组...

    poj习题答案

    3. **字符串处理**:KMP算法、Rabin-Karp算法、Manacher's Algorithm等。 4. **数学应用**:模运算、数论、组合数学、图论等。 5. **递归与分治**:递归解决问题的技巧,分治策略的应用。 6. **动态规划优化**:...

    西工大新版POJ100题合集

    例如,T071题可能需要理解并实现栈的特性来解决回文字符串检测,T075题可能需要运用队列进行广度优先搜索,而T097题可能涉及到图的深度优先搜索或最短路径算法。通过这些题目,学生能够深入理解数据结构的原理,并...

    acm训练计划(poj的题)

    - (poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503):字符串操作算法,如哈希函数的使用、模式匹配算法等。 4. **集合和映射**: - (poj3253):探讨如何高效地进行元素插入、删除及查找等操作。 5. **...

    POJ部分源代码(151题)

    - "字符串处理"可能包括模式匹配、字符串操作等。 - "数论"可能涉及到素数检测、最大公约数、最小公倍数等问题。 - "数据结构"可能涵盖数组、链表、栈、队列、树、图、哈希表等多种结构。 对于初学者来说,研究这些...

Global site tag (gtag.js) - Google Analytics