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 }

浙公网安备 33010602011771号