题目链接: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;
}