poj1035 Spell checker

本文介绍了一个字符串匹配问题的解决方法,通过自定义字典进行单词的正确性验证,并提供了替换、删除或添加字符以使单词匹配字典条目的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:有本自定义的字典,有一些单词。查询,某个单词是否在字典中存在,如果存在,则输出“is correct”;否则,存在三种可能情况:

1。替换其中一个字母,使其在字典中存在;

2。删除其中一个字母,使其在字典中存在;

3。添加某一个字母,使其在字典中存在;

先说一句,这是我两个多月来,第一次A的一个题。至于为什么会这样,这两个多月来发生的事情我就不提了。这是一个新的开端,fighting。(其实想想自己两个多月没敲代码,我连自己都不敢相信,55555555~。他妈的,怎么这么矫情)

吐槽一下这个题,算法根本没问题,代码写的也没问题。测了很多测试数据,但一开始就是过不了。后来把单词的输出放在了replace函数中(一开始是返回字母的指针),结果就对了。搞不懂,可能有的地方没搞好。也是折腾了好久,但还是没放弃啊。嗯嗯,一开始想放弃,但最终还是A了。所以说,不要轻易放弃。额,啰嗦了,希望没人看到。不过,这也算是我新的开始,要好好搞了。

#include<iostream>
#include<cstring>
#define MAX 10100
#define N 55
using namespace std;
struct word
{
  char s[16];
  int len;
};
word dicy[MAX];
word chek[N];
int d_num,c_num;
bool is_correct(char *p)
{
	for(int j=0;j<d_num;j++)
		if(strcmp(dicy[j].s,p)==0)
			return true;
	return false;
}
void replace(word chek,word dicy)
{
	int count;
	if(chek.len==dicy.len)
	{
	   count=0;
	   for(int i=0;i<chek.len;i++)
		   if(chek.s[i]!=dicy.s[i])
			   count++;
		if(count==1)cout<<" "<<dicy.s;
	}
	if(chek.len+1==dicy.len)
	{
		int j=0;
		count=0;
	   for(int i=0;i<dicy.len;i++)
		   if(chek.s[j]!=dicy.s[i])
			   count++;
		   else
			 j++;
          if(count==1)cout<<" "<<dicy.s;
	}
	if(chek.len-1==dicy.len)
	{
	  int k=0;
	  count=0;
	    
	  for(int i=0;i<chek.len;i++)
		  if(chek.s[i]!=dicy.s[k])
			  count++;
		else 
		  k++;
          if(count==1)cout<<" "<<dicy.s;
	}
}
int main()
{
	char s[20];
	int i,len;
	i=0;
	while(cin>>s)
	{
	  if(s[0]=='#')
		  break;
	  strcpy(dicy[i].s,s);
	  len=strlen(s);
	  dicy[i].len=len;
	  i++;
	}
	d_num=i;
	i=0;
	while(cin>>s)
	{
	 if(s[0]=='#')
		  break;
	  strcpy(chek[i].s,s);
	  len=strlen(s);
	  chek[i].len=len;
	  i++;
	}
	c_num=i;
	for(i=0;i<c_num;i++)
	{
		if(is_correct(chek[i].s))
			cout<<chek[i].s<<" is correct"<<endl;
		else
		{
			cout<<chek[i].s<<":";
			for(int j=0;j<d_num;j++)
				replace(chek[i],dicy[j]);
            cout<<endl;			   
		}
	}
  return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值