学姐思路非常清下,膜拜orz…orz
POJ 1035
大致题意:
输入一部字典,输入若干单词
1、 若某个单词能在字典中找到,则输出corret
2、 若某个单词能通过 变换 或 删除 或 添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据 输入的那部字典的字典序
3、 若某个单词无论操作与否都无法在字典中找得到,则输出空
暴力吧!模拟吧!
基本思路就是逐个比较 待查单词 与 字典单词 的长度,当且仅当两者长度之差的绝对值<=1时才进行检查操作。
//Memory Time
//456K 157MS
#include<iostream>
#include<string.h>
using namespace std;
char dict[10001][16];
char word[51][16];
int DictNum=0; //字典计数器
int WordNum=0; //单词计数器
void Input(void);
bool Change(char* word,char* dict); //检查字符串word能否通过变换得到dict
bool Del(char* word,char* dict); //检查字符串word能否通过删除得到dict
bool Add(char* word,char* dict); //检查字符串word能否通过添加得到dict
int main(void)
{
Input();
int* DictLen=new int[DictNum]; //记计算字典中各个单词的长度
for(int n=0;n<DictNum;n++)
DictLen[n]=strlen(dict[n]);
for(int i=0;i<WordNum;i++)
{
int* address=new int[DictNum]; //记录word[i]通过变化得到的单词在dict中的下标
int pa=0; //address指针
bool flag=false; //标记字典中是否含有单词word[i]
int len=strlen(word[i]);
for(int k=0;k<DictNum;k++) //遍历字典
{
if(DictLen[k]==len) //Change or Equal
{
if(!strcmp(word[i],dict[k]))
{
flag=true;
break;
}
else if(Change(word[i],dict[k]))
address[pa++]=k;
}
else if(len-DictLen[k]==1) //Delete
{
if(Del(word[i],dict[k]))
address[pa++]=k;
}
else if(DictLen[k]-len==1) //Add
{
if(Add(word[i],dict[k]))
address[pa++]=k;
}
}
/*Output*/
if(flag)
cout<<word[i]<<" is correct"<<endl;
else
{
cout<<word[i]<<": ";
for(int j=0;j<pa;j++)
cout<<dict[ address[j] ]<<' ';
cout<<endl;
}
delete address;
}
return 0;
}
void Input(void)
{
while(cin>>dict[DictNum] && dict[DictNum++][0]!='#');
while(cin>>word[WordNum] && word[WordNum++][0]!='#');
DictNum--; //剔除'#'
WordNum--;
return;
}
bool Change(char* word,char* dict) //WordLen==DictLen
{
int dif=0; //记录word与dict中在相同位置出现不同字符的个数
while(*word)
{
if(*(word++) != *(dict++))
{
dif++;
if(dif>1)
return false;
}
}
return true;
}
bool Del(char* word,char* dict) //WordLen==DictLen+1
{
int dif=0; //记录word与dict中在对应位置出现不同字符的个数
while(*word)
{
if(*word != *dict)
{
word++; //word后移一位再匹配
dif++;
if(dif>1)
return false;
}
else
{
word++;
dict++;
}
}
return true;
}
bool Add(char* word,char* dict) //WordLen==DictLen-1
{
int dif=0; //记录word与dict中在对应位置出现不同字符的个数
while(*dict)
{
if(*word != *dict)
{
dict++; //dict后移一位再匹配
dif++;
if(dif>1)
return false;
}
else
{
word++;
dict++;
}
}
return true;
}
2014.9.27
自己又打了一遍代码,有一处需要注意,即输入处理
#include<cstdio>
#include<cstring>
#define N 10000+10
#include<iostream>
using namespace std;
int dictlen[N];
char dict[N][17],word[51][17];
bool change(char *word,char *dict)
{
int dif=0;
while(*word)
{
if(*(word++)!=*(dict++))
{
dif++;if(dif>1) return false;
}
}
return true;
}
bool del(char *word,char *dict)
{
int dif=0;
while(*word)
{
if(*word!=*dict)
{
word++;dif++;
if(dif>1) return false;
}
else
{
word++,dict++;
}
}
return true;
}
bool add(char *word,char *dict)
{
int dif=0;
while(*dict)
{
if(*word!=*dict)
{
dict++;dif++;if(dif>1) return false;
}
else
{
word++,dict++;
}
}
return true;
}
int main()
{
int dictnum=0,wordnum=0;
while(cin>>dict[dictnum] && dict[dictnum++][0]!='#'); //看input ,这里要注意哦,输入技巧,下面的就不可以!!!
while(cin>>word[wordnum] && word[wordnum++][0]!='#');
//while(scanf("%s",dict[dictnum]))if(dict[dictnum++][0]=='#') break; //XXXXXX!!!!!!
//while(scanf("%s",word[wordnum]))if(word[wordnum++][0]!='#') break;
dictnum--,wordnum--;
for(int i=0;i<dictnum;i++)
dictlen[i]=strlen(dict[i]);
for(int i=0;i<wordnum;i++)
{
int* address=new int[dictnum];
int len=strlen(word[i]);
bool flag=false;
int pa=0;
for(int j=0;j<dictnum;j++)
{
if(len==dictlen[j])
{
if(!strcmp(word[i],dict[j]))
{
flag=true;break;
}
else if(change(word[i],dict[j]))
address[pa++]=j;
}
if(len-dictlen[j]==1)
{
if(del(word[i],dict[j]))
address[pa++]=j;
}
if(dictlen[j]-len==1)
{
if(add(word[i],dict[j]))
address[pa++]=j;
}
}
if(flag)
printf("%s is correct\n",word[i]);
else
{
printf("%s: ",word[i]);
for(int k=0;k<pa;k++)
{
printf("%s ",dict[address[k]]);
}
puts("");
}
delete address;
}
}