判断字符串相似程度
在使用搜索引擎的过程中~我们经常会会发现,搜索引擎会返回我们搜索关键词的相似词
这是一种非常人性话的功能
其实不光是搜索引擎~,我们在进行数据库的操作的时候其实也是希望能有相似词的返回~这样可以大大的简化我们的工作~
其实这个问题,传说编程之美也有,但是Xushine研究院苦于囊中羞涩~所以并木看过,哪位好心人看过请告知~
/*判断一个字符串是否包含另一个字符串函数(字符串中的字符即可以是字母数字又可以是文字) 用来判断一个字符串是否包含另一个字符串(即一个字符串是否是另一个字符串的子串) a:接收长字符串 b:接收短字符串(即要判断的子串) 返回值:0:b不是a的子串 1:b是a的子串*/ int Contain(char* a,char *b) { int len=Strlen(b); while(*a!=\'\\0\') { bool flag; if(*a<0) //如果当前的字符的ASCII码为正(判断一位是否相等),为负(判断两位是否相等) { flag=(*a==*b&&*(a+1)==*(b+1)); //判断两位 } else { flag=(*a==*b); //判断一位 } if(flag) { char *p=a,*q=b,count=0; while(*p!=\'\\0\'&&*q!=\'\\0\') { if(*p<0) //如果当前的字符的ASCII码为正(判断一位是否相等),为负(判断两位是否相等) { flag=(*p==*q&&*(p+1)==*(q+1)); //判断两位 } else { flag=(*p==*q); //判断一位 } if(flag) count++; //相等count加1 (*p>0)?p++:p=p+2; //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位) (*q>0)?q++:q=q+2; } if(count==len) //count等于字符串b的准长度表示字符串a包含字符串b返回1 { return 1; } } (*a>0)?a++:a=a+2; //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位) } return 0; } /*姓名模糊查找函数(姓名或条件字符串中的字符即可以是字母数字又可以是文字) 功能说明:此函数用来判断姓名字符串与条件字符串的相似程度 ( 例如:若查找条件字符串叫"李斌强",则程序将 按\'李斌强\'、\'李斌\'、\'斌强\'、\'李\'、\'斌\'、\'强\' 依次匹配,匹配一个相似程度相应增加一级, 若一个人的姓名叫"李斌强",则其相似程度为6级; 若一个人的姓名叫"李斌宾强",则其相似程度为4级; 若一个人的姓名叫"王斌强",则其相似程度为3级; 若一个人的姓名叫"李宾强",则其相似程度为2级; 若一个人的姓名叫"李bin强",则其相似程度为2级; 若一个人的姓名叫"Mr.李",则其相似程度为1级; ) foun:接收姓名字符串 cond:接收条件字符串 返回值:相似程度(假设条件字符串有3个汉字,则最大相似程度为6级<1+2+3=6>)*/ int Namcmp(char* foun,char* cond) { char* p=cond; int len=Strlen(cond); int count=0; //记录相似程度 for(int i=0;i<len;i++) //条件字符串的准长度 { p=cond; for(int j=0;j<i+1;j++) //有多少个准长度相同的子串就循环多少次 { char *s=p; char temp[20]; char *t=temp; for(int k=0;k<len-i;k++) //子串的准长度是多少就循环多少次 { if(*s>0) //如果当前的字符的ASCII码为正(赋值一位),为负(赋值两位) { *t=*s; //赋值一位 } else { *t=*s; *(++t)=*(++s); //赋值两位 } s++; t++; } *t=\'\\0\'; t=new char[20]; strcpy(t,temp); if(Contain(foun,t)) count++; //判断姓名字符串是否包含刚拆分的条件字符串的子串 delete t; (*p>0)?p++:p=p+2; //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位) } } return count; }
评论被关闭。