先给定一个标准字典,然后不断输入串,要求找出字典中和输入串相同或是只相差一个字符的串。 对自己check()部分的代码很满意,不过有点遗憾的是贡献了一次PE。 #include <iostream> using namespace std; char dictionary[10005][16]; int word_len[10005],candidate[505]; int word_num,candidate_num; char str_temp[17]; int str_len; int check(int i) { int index1=0,index2=0; if(word_len[i]==str_len) { if(strcmp(str_temp,dictionary[i])==0) return 0; else { while(dictionary[i][index1]==str_temp[index1]) index1++; index1++;//因为最多只能有一个字母不同,所以不同的地方直接跳过 while(dictionary[i][index1]==str_temp[index1]) index1++; if(index1>=str_len) return 1; else return -1; } } else if(word_len[i]==str_len-1) { while(dictionary[i][index1]==str_temp[index2]) index1++,index2++; index2++;//因为最多只能有一个字母不同,所以不同的地方直接跳过 while(dictionary[i][index1]==str_temp[index2]) index1++,index2++; if(index1>=str_len-1) return 1; else return -1; } else if(word_len[i]==str_len+1) { while(dictionary[i][index1]==str_temp[index2]) index1++,index2++; index1++;//因为最多只能有一个字母不同,所以不同的地方直接跳过 while(dictionary[i][index1]==str_temp[index2]) index1++,index2++; if(index1>=str_len+1) return 1; else return -1; } return -1; } bool solve() { int ans; candidate_num=0; str_len=strlen(str_temp); for(int i=0;i<word_num;i++) { ans=check(i); if(ans==0) return true; else if(ans==1) candidate[candidate_num++]=i; } return false; } int main() { word_num=0; while(1) { scanf("%s",dictionary[word_num]); word_len[word_num]=strlen(dictionary[word_num]); if(dictionary[word_num][0]=='#') break; else word_num++; } while(1) { scanf("%s",str_temp); if(str_temp[0]=='#') break; if(solve()) printf("%s is correct/n",str_temp); else { printf("%s:",str_temp); for(int i=0;i<candidate_num;i++) printf(" %s",dictionary[candidate[i]]); printf("/n"); } } return 0; }