POJ 1035(字符串模拟)

该博客主要解析POJ 1035问题,要求判断给定单词是否能通过字典中单词的替换、删除或插入操作得到。博主建议采用模拟方法解决,并提醒注意数据规模及清晰思考解题策略。

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

题目链接:http://poj.org/problem?id=1035

题意:给出一个字典,然后给出一些单词,问能否通过一下变换在字典中找到该单词:

①替换一个字符

②删除一个字符

③插入一个字符

若该单词已在字典中,则不需要变化。

若无法通过变换找到该单词,则不需要输出。

思路:

模拟吧,数据不是很大,但是一定要想清楚再去写代码,模拟题是硬伤。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=10010;
char dic[maxn][100];
int cnt;

void read_Dic(){
	cnt=0;
	while(scanf("%s",dic[cnt])){
		if(dic[cnt][0]=='#')
			break;
		cnt++;
	}
}

bool isCorrect(char *str){
	for(int i=0;i<cnt;i++){
		if(strcmp(str,dic[i])==0)
			return true;
	}
	return false;
}

void Replace(char *str,char *dic){
	int diff=0;
	int dicLen=strlen(dic);
	for(int j=0;j<dicLen;j++){
		if(str[j]!=dic[j])
			diff++;
	}
	if(diff==1)
		printf(" %s",dic);
}

void Insert(char *str,char *dic){
	int arr[100];
	int len=strlen(str);
	int dicLen=strlen(dic);
	memset(arr,-1,sizeof(arr));
	for(int j=0;j<len;j++){
		for(int k=j==0?0:arr[j-1]+1;k<dicLen;k++){
			if(str[j]==dic[k]){
				arr[j]=k;
				break;
			}
		}
	}
	bool isMatch=true;
	for(int j=0;j<len;j++){
		if(arr[j]==-1){
			isMatch=false;
			break;
		}
	}
	if(isMatch) printf(" %s",dic);
}

void Delete(char *str,char *dic){
	int arr[100];
	int len=strlen(str);
	int dicLen=strlen(dic);
	memset(arr,-1,sizeof(arr));
	for(int j=0;j<dicLen;j++){
		for(int k=j==0?0:arr[j-1]+1;k<len;k++){
			if(str[k]==dic[j]){
				arr[j]=k;
				break;
			}
		}
	}
	bool isMatch=true;
	for(int j=0;j<dicLen;j++){
		if(arr[j]==-1){
			isMatch=false;
			break;
		}
	}
	if(isMatch) printf(" %s",dic);
}

void Operate_Str(char *str){
	printf("%s:",str);
	int len=strlen(str);
	for(int i=0;i<cnt;i++){
		int dicLen=strlen(dic[i]);
		if(len==dicLen){//替换
			Replace(str,dic[i]);
		}
		else if(len+1==dicLen){//插入
			Insert(str,dic[i]);
		}
		else if(len==dicLen+1){//删除
			Delete(str,dic[i]);
		}
	}
	putchar(10);
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
#endif
	read_Dic();
	char str[100];
	while(scanf("%s",str)){
		if(str[0]=='#') break;
		if(isCorrect(str))
			printf("%s is correct\n",str);
		else
			Operate_Str(str);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值