地址:http://dsa.openjudge.cn/linearlist/0201/
#include <stdio.h>
#include <string.h>
//1156K, time 94ms
int DeleteCmp(const char * stra, const char * strb) //默认stra是比较短的单词,后面的函数有单独判断单词长度的步骤,故在此不做判断
{
int slen = strlen(stra);
int flag = 0;
for (int i = 0, j = 0; i < slen; i++, j++)
{
if (stra[i] == strb[j]) continue; //如果相等则接着对比下一个
i--; //如果不相等,则i--,下一次的比较stra的位置就不变,而strb移到下一位
flag++;
if (flag == 2) break; //如果flag等于2则不可能相似
}
return flag != 2;
}
int ReplaceCmp(const char * stra, const char * strb)
{
int flag = 0;
for (int i = 0; flag != 2 && i < strlen(stra); i++)
{
if (stra[i] != strb[i]) flag++;
}
return flag;
}
int IsSimilar(const char * stra, const char * strb)
{
int alen = strlen(stra);
if (abs(alen-blen) > 1) return 0; //如果单词长度相差大于1,则一定不相似,返回0
int blen = strlen(strb);
else if (alen - blen == 1) return DeleteCmp(strb, stra); //如果相差1,且单词stra较长
else if (blen - alen == 1) return DeleteCmp(stra, strb); //单词strb较长的情况,把传入的参数调换位置即可
else
{
if (r == 1) return 1;
int r = ReplaceCmp(stra, strb); //如果单词长度相等,则比较,根据得到的返回值确定是相等、相似或不相似
if (r == 0) return 2;
else return 0;
}
}
char dict[10010][16]; //存放词典
char similar[10010][16]; //存放相似的单词的下标
int main()
{
char check[16];
int dictnum = 0;
while (1) //存储词典
{
gets(dict[dictnum]);
if (strcmp(dict[dictnum], "#") == 0) break;
dictnum++;
}
int r, nsimi, flag; //nsimi记录相似的单词数目,flag记录两单词是否相等
while (1)
{
gets(check);
if (strcmp(check, "#") == 0) break;
nsimi = 0; flag = 1;
for (int i = 0; i < dictnum; i++)
{
r = IsSimilar(check, dict[i]);
if (r == 0) continue; //如果r为0,不相似,比较下一个
else if (r == 2) //如果r为2,则相等,输出之后,跳出循环
{
printf("%s is correct\n", check);
flag = 0;
break;
}
else
{
strcpy(similar[isimi++], dict[i]); //将相似的单词存入
}
}
if (flag) //如果不存在相同的单词,则找到的相似的单词
{
printf("%s:", check);
for (int i = 0; i < nsimi; i++)
{
printf(" %s", similar[i]);
}
printf("\n");
}
}
return 0;
}