您的位置:首页 > 其它

poj 1035

2013-12-14 20:01 351 查看
这是一个简单的字符串查找和判断问题:

题目的大意是:

输入一部字典,输入若干单词

1、  若某个单词能在字典中找到,则输出corret

2、 
若某个单词能通过 交换一个字符
删除
添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据 
输入的那部字典的字典序

3、  若某个单词无论操作与否都无法在字典中找得到,则输出空。

这个题目的关键在于理解:若某个单词能通过交换、删除、添加一个字符,而变成字典中的某个单词,那么这个单词和字典中的那个肯定只相差一个字符。

下面是我的代码:

//Memory Time

//456K  157MS

#include

#include

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

  DictLen
=strlen(dict
);

 for(int i=0;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

  {

   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;

   }

  }

  

  if(flag)

   cout<<word[i]<<"
is correct"<<endl;

  else

  {

   cout<<word[i]<<":
";

   for(int
j=0;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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: