poj 1035

来源:互联网 发布:如何用c语言做贪吃蛇 编辑:程序博客网 时间:2024/06/05 08:03

这是一个简单的字符串查找和判断问题:

题目的大意是:

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

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=newint[DictNum];  //记计算字典中各个单词的长度
 for(int n=0;n
  DictLen[n]=strlen(dict[n]);

 for(int i=0;i
 {
  int* address=newint[DictNum];  //记录word[i]通过变化得到的单词在dict中的下标
  int pa=0; //address指针

  boolflag=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;
    }
    elseif(Change(word[i],dict[k]))
     address[pa++]=k;
   }
   elseif(len-DictLen[k]==1)  //Delete
   {
    if(Del(word[i],dict[k]))
     address[pa++]=k;
   }
   elseif(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(intj=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)
    returnfalse;
  }
 }
 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)
    returnfalse;
  }
  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)
    returnfalse;
  }
  else
  {
   word++;
   dict++;
  }
 }
 return true;
}

0 0
原创粉丝点击