分析 :
按照题目的意思,检查字符串是否符合要求。
每个要求对应一个函数,注意:插入是删除的逆过程,不用重复写函数。
这样逻辑清晰,简单易懂。
代码如下:
#include <stdio.h>
#include <string.h>
// 删除
bool del(char s1[], char s2[]){
int i,j;
bool flag = true;
for(i=j=0; s1[i] || s2[j]; i++,j++){
if(s1[i] != s2[j]) {
if(!flag) return false;
j--;
flag = false;
}
}
return i == j + 1;
}
// 插入(删除的逆过程)
bool ins(char s1[], char s2[]){
return del(s2, s1);
}
// 替换
bool rep(char s1[], char s2[]){
int i;
bool flag = true;
for(i=0; s1[i]; i++){
if(s1[i] != s2[i]){
if(!flag) return false;
flag = false;
}
}
return s2[i] == 0 && !flag;
}
// 比较
bool cmp(char s1[], char s2[]){
return strcmp(s1, s2) == 0;;
}
char d[10020][20];
char o[10020][20];
char q[20];
int main(){
int i=0,k,j,n;
bool flag;
while(scanf("%s", d[i]), d[i++][0]!='#');
n = i - 1;
while(scanf("%s", q), q[0]!='#'){
flag = false;
for(i=k=0; i<n; i++){
if(cmp(q, d[i])){ // 优先相等判断
flag = true;
break;
}else if(rep(q, d[i])
||ins(q, d[i])
||del(q, d[i])){
strcpy(o[k++], d[i]); // 输出保存
}
}
if(flag){
printf("%s is correct", q);
}else{
printf("%s:", q);
for(i=0; i<k ;i++){
printf(" %s", o[i]);
}
}
printf("\n");
}
return 0;
}