`

poj 1035

 
阅读更多

关于图论的一些问题暂时到此结束,下面进入数据结构专题,首先讨论串的问题:

题意:

先输入一个字典,再输入一些字符串,在字典里找到与该字符串相同的单词,若没有,找到与其差一个的单词:多一个字符or少一个字符or错一个字符

输入:

一个字典,#结束

输入n个字符串,在字典中查找,一共有五种情况:

输出:

** is correct

String: string1 string 2

关于输出的操作,一共分为五种情况 a:两个单词完全一致,则输出 **is correct

如果长度相差为一或者为O(有一个单词不一样),这时有二种情况,1: 相差为一(分为两种情况1:大于一2:小于一);2:相差为0;b:单词长度相差大于等于二,则不输出结果。

针对这五种情况讨论即可:

思路:

输入的字符串一共有5中情况:

1、和字典里匹配成功,输出“正确”

2、删除一个可以匹配

3、插入一个可以匹配

4、更改一个可以匹配

5、其他情况

代码如下:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

char s[20];  
int n,size=0;        
string v,a[10010],b[10010]; 

bool cmp(string s1,string s2)

{//如果比较的串和字典中的串长度差的为-1.0.1:

       int s=0;  
	   string t;  
	   if(s1.size()>s2.size())  //s1>s2大就交换,保证s2>=s1
	   {
		   t=s1;
		   s1=s2;
		   s2=t;
	   } 

       if(s1.size()<s2.size()) //就是a!=b,大于的话已经交换了
	   {
		   s=0;     
		   for(int i=0;i<s2.size()&&s<s1.size();i++)    
			   if(s1[s]==s2[i]) 
				   s++;
			   if(s==s1.size())      
				   return true; //因为b=a+1,所以只有一个不一样的话,删除一个就是正确的
	   }//end if 完成了2、删除一个就正确 3、插入一个就正确
	   else//长度相等的话
	   {
		   s=0;       
		   for(int r=0;r<s1.size();r++)      
			   if(s1[r]==s2[r]) s++;   
			   if(s==s1.size()-1)         
				   return true;//s为匹配的个数如果有且只有一个不一样的
	   }//完成了4、更改一个正确   
	   return false;
}//end of cmp

int main()

{    
	while(scanf("%s",s)!=EOF)  
	{ //输入字典:

              if(!strcmp(s,"#")) break; 

              b[size]=s;

              a[size]=s;

              ++size;

       }   

       sort(a,a+size);  //对a排序 (默认为升序)

       //a的存在只是为了查找一样的,后面没用了。

       while(scanf("%s",s)!=EOF)  

       { //输入要查的字    

              if(!strcmp(s,"#")) break;    

              v=s;      

              n=v.size();       

              if(binary_search(a,a+size,v)) //从a开始到a+size找和v相同的,//用二分查找(折半查找和v相同的)1、若存在,则输出* is correct  
			  {
				  cout << v << " is correct\n" ;
				  continue;
			  } 

              cout << v <<": ";

       //     同printf("%s: ",v.c_str());

              int i;

              for(i=0;i<size;i++)     

              {//从头到尾搜索字典。。。。           

                     if(b[i].size()<n-1||b[i].size()>n+1)

                            continue;

//若打错的字和字典里的字相差2位或者2位以上,无匹配

                     if(cmp(b[i],v)) 

//若打错的字和字典里的字相差1位或者不差,则可能可以通过2、3、4种方法改正 

                            cout<< b[i] <<" ";

       //     同printf("%s ",b[i].c_str());   

              }      

              cout<<endl;

       } //end while  

       return 0;

}

 

 

分享到:
评论

相关推荐

    POJ1035-Spell checker 测试数据

    "POJ1035-Spell checker 测试数据" 是一个与编程竞赛相关的主题,其中“POJ”是北京大学主办的在线编程平台Problem Online Judge的缩写,它提供了各种算法题目供参赛者挑战。"Spell checker" 指的是这个题目所涉及的...

    POJ1035-Spell checker

    【标题】"POJ1035 - Spell checker"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个题目要求参赛者编写一个拼写检查器,对输入的单词进行错误检测并提供可能的纠正...

    多种解题技巧POJ1035_Spelling Checker

    《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...

    POJ算法题目分类

    * 串:串是指解决问题的基本数据结构,如 poj1035、poj3080、poj1936。 * 排序:排序是指解决问题的排序算法,如快排、归并排、堆排。 * 简单并查集:简单并查集是指解决问题的简单并查集算法。 * 哈希表和二分查找...

    poj题目分类

    * 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用。 * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树...

    poj训练计划.doc

    - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如快速排序和归并排序,用于对数据进行排序,如`poj2388, poj2299`。 - 并查集:用于处理集合的合并和查询...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1035, poj3080, poj1936 - **解释**:树形数据结构的题目通常涉及树的遍历、查找等问题。 #### 2. 字符串 - **例题**:poj2388, poj2299 - **解释**:字符串问题通常涉及字符串的模式匹配、编辑距离...

    POJ2586-Y2K Accounting Bug

    【标题】"POJ2586-Y2K Accounting Bug" 是一道来自北京大学在线判题系统POJ(Problem Set)的编程题目。该题目主要关注的是计算机编程中的一个历史问题——Y2K千年虫问题(Year 2000 Problem),同时也涉及到会计...

    POJ题目简单分类(ACM)

    - **字符串处理**:如poj1035,涉及字符串操作和模式匹配。 - **排序算法**:包括快速排序、归并排序和堆排序,如poj2388,优化查找效率。 - **并查集**:用于处理集合合并与查询问题。 - **哈希表和二分查找**...

    acm训练计划(poj的题)

    - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - (poj2388, poj2299):介绍二叉树、平衡二叉树等。 3. **字符串处理**: - (poj3349, poj3274, POJ2151, poj1840, poj2002, poj...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    acm新手刷题攻略之poj

    - 推荐题目:[poj1035](https://vjudge.net/problem/POJ-1035)、[poj3080](https://vjudge.net/problem/POJ-3080)、[poj1936](https://vjudge.net/problem/POJ-1936) - 堆结构通常用于实现优先队列等数据结构。 2...

    ACM-POJ 算法训练指南

    1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在优先队列中的应用(poj2388, poj2299)。 3. **哈希表**:用于快速查找和存储,如Hash函数的设计(poj3349,...

    POJ 分类题目

    - poj1035 - poj3080 - poj1936 - **应用场景**:适用于文本处理、模式匹配等问题。 **2. 排序** - **定义**:包括快速排序、归并排序、堆排序等。 - **示例题目**: - poj2388 - poj2299 - **应用场景**:...

    强大的POJ分类——各类编程简单题及其算法分类

    1. **串**:处理字符串的问题,如POJ1035、3080和1936。 2. **排序**:包括快速排序、归并排序(涉及逆序数)、堆排序,如POJ2388、2299。 3. **并查集**:处理集合合并和查询问题。 4. **哈希表** 和 **二分查找**...

    POJ题目分类

    - **示例题目**: poj1035, poj3080, poj1936 #### 2. 栈 - **内容**: 包括栈的基本操作如入栈、出栈等。 - **示例题目**: poj2388, poj2299 #### 3. 字典树 - **内容**: 字典树是一种高效的数据结构,主要用于...

    ACMer需要掌握的算法讲解 (2).docx

    * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002、POJ2503 * 哈夫曼树:POJ3253 * 背包问题:POJ1837、POJ1276 * DP算法:POJ3267、POJ1836、...

    ACM常用算法及其相应的练习题.docx

    * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj...

    ACM 详解算法目录

    例如,POJ1035和POJ3080是串的经典例题,而POJ2388和POJ2299则是排序算法的代表题。 在简单搜索部分,涵盖了深度优先搜索和广度优先搜索两种搜索算法。例如,POJ2488和POJ3083是深度优先搜索的经典例题,而POJ3278...

Global site tag (gtag.js) - Google Analytics