biying

导航

poj1035 数据结构串(1)

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

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

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

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

View Code
  1 //Memory Time
  2 //456K  157MS
  3 
  4 #include<iostream>
  5 #include<string.h>
  6 using namespace std;
  7 
  8 char dict[10001][16];
  9 char word[51][16];
 10 
 11 int DictNum=0; //字典计数器
 12 int WordNum=0; //单词计数器
 13 
 14 void Input(void)
 15 {
 16     while(cin>>dict[DictNum] && dict[DictNum++][0]!='#');
 17     while(cin>>word[WordNum] && word[WordNum++][0]!='#');
 18 
 19     DictNum--;  //剔除'#'
 20     WordNum--;
 21     return;
 22 }
 23 //检查字符串word能否通过变换得到dict
 24 bool Change(char* word,char* dict)  //WordLen==DictLen
 25 {
 26     int dif=0;  //记录word与dict中在相同位置出现不同字符的个数
 27 
 28     while(*word)
 29     {
 30         if(*(word++) != *(dict++))
 31         {
 32             dif++;
 33             if(dif>1)
 34                 return false;
 35         }
 36     }
 37     return true;
 38 }
 39 //检查字符串word能否通过删除得到di
 40 bool Del(char* word,char* dict)  //WordLen==DictLen+1ct
 41 {
 42     int dif=0;  //记录word与dict中在对应位置出现不同字符的个数
 43 
 44     while(*word)
 45     {
 46         if(*word != *dict)
 47         {
 48             word++;  //word后移一位再匹配
 49             dif++;
 50             if(dif>1)
 51                 return false;
 52         }
 53         else
 54         {
 55             word++;
 56             dict++;
 57         }
 58     }
 59     return true;
 60 }
 61 
 62 //检查字符串word能否通过添加得到dict
 63 bool Add(char* word,char* dict)  //WordLen==DictLen-1
 64 {
 65     int dif=0;  //记录word与dict中在对应位置出现不同字符的个数
 66 
 67     while(*dict)
 68     {
 69         if(*word != *dict)
 70         {
 71             dict++;  //dict后移一位再匹配
 72             dif++;
 73             if(dif>1)
 74                 return false;
 75         }
 76         else
 77         {
 78             word++;
 79             dict++;
 80         }
 81     }
 82     return true;
 83 }
 84 
 85 int main(void)
 86 {
 87     Input();
 88 
 89     int* DictLen=new int[DictNum];  //记计算字典中各个单词的长度
 90     for(int n=0;n<DictNum;n++)
 91         DictLen[n]=strlen(dict[n]);
 92 
 93     for(int i=0;i<WordNum;i++)
 94     {
 95         int* address=new int[DictNum];  //记录word[i]通过变化得到的单词在dict中的下标
 96         int pa=0; //address指针
 97 
 98         bool flag=false;  //标记字典中是否含有单词word[i]
 99         int len=strlen(word[i]);
100 
101         for(int k=0;k<DictNum;k++)  //遍历字典
102         {
103             if(DictLen[k]==len)  //Change or Equal
104             {
105                 if(!strcmp(word[i],dict[k]))
106                 {
107                     flag=true;
108                     break;
109                 }
110                 else if(Change(word[i],dict[k]))
111                     address[pa++]=k;
112             }
113             else if(len-DictLen[k]==1)  //Delete
114             {
115                 if(Del(word[i],dict[k]))
116                     address[pa++]=k;
117             }
118             else if(DictLen[k]-len==1)  //Add
119             {
120                 if(Add(word[i],dict[k]))
121                     address[pa++]=k;
122             }
123         }
124 
125         /*Output*/
126 
127         if(flag)
128             cout<<word[i]<<" is correct"<<endl;
129         else
130         {
131             cout<<word[i]<<": ";
132             for(int j=0;j<pa;j++)
133                 cout<<dict[ address[j] ]<<' ';
134             cout<<endl;
135         }
136 
137         delete address;
138     }
139     return 0;
140 }

 

posted on 2013-04-14 21:03  biying  阅读(230)  评论(0)    收藏  举报