可以先看看我的字符串匹配文章:
接下来是单词匹配的函数
在做POJ1598 我写的1598:POJ-1598 C语言
的时候 需要检验完整的单词
即 匹配串是一个单词 在主串里也必须是一个单词
如 主串 I am a man,you are a superwoman.
次串1 woman 次串2 superwoman
则 主串中是不含有次串1的 含有次串2
先展示一个单匹配的:
# include <stdio.h>
# define At(t) (t<'a'||t>'z')&&(t<'A'||t>'Z')
int CMP(char a,char b){//如果忽略大小写则三个 否则,只保留 a==b即可
return a==b+32||b==a+32||a==b;
}
int BF(char a[],char b[]){//a中如果有b这个单词返回1 否则返回0
int i=0,j=0;
do{
if (b[j]&&CMP(a[i++],b[j]))++j;//若a[i]与b[j]相等或是大小写关系 继续比较
else{
if(!b[j]){//如果b字符串到头了 此时需要检查 b在a字符串是否为完整的单词
if((i!=j)&&At(a[i-j-1])||(i==j))//i==j时 b在a字符串的串首 如果不在串首,则i!=j 此时应检查a[i-j-1]
if(!a[i]||a[i]&&At(a[i]))//如果b在a字符串的串尾 则a[i]==0 如果不在末尾 则检验 a[i]
return 1;//此时b在a里是个完整的单词 返回1
}
else i-=j;
j=0;
}
}while(a[i-1]);
return 0;//检查完没有返回0
}
int main(){
char A[]={"I have a superdog,My god!"},B[]={"dog"},C[]={"superdog"};
printf("A里有B这个完整的单词 %s\n",BF(A,B)?"YES":"NO");
printf("A里有C这个完整的单词 %s\n",BF(A,C)?"YES":"NO");
return 0;
}
全匹配的代码:
# include <stdio.h>
# define N 101
# define At(t) (t<'a'||t>'z')&&(t<'A'||t>'Z')
int CMP(char a,char b){
return a==b+32||b==a+32||a==b;
}
void BF(char a[],char b[],int c[]){//匹配 a中b单词完整的个数 c[0]存储匹配的个数 c[1],c[2]……存储匹配的单词的 下标 使用方法和群里的 字符串匹配下标相同
int i=0,j=0,k=0;
do{
if (b[j]&&CMP(a[i++],b[j]))++j;//若a[i]与b[j]相等或是大小写关系 继续比较
else{
if(!b[j]){//如果b字符串到头了 此时需要检查 b在a字符串是否为完整的单词
if((i!=j)&&At(a[i-j-1])||(i==j))//i==j时 b在a字符串的串首 如果不在串首,则i!=j 此时应检查a[i-j-1]
if(!a[i]||a[i]&&At(a[i]))//如果b在a字符串的串尾 则a[i]==0 如果不在末尾 则检验 a[i]
c[++k]=i-j;//存储当前匹配的单词位置
}
else i-=j;
j=0;
}
}while(a[i-1]);
c[0]=k;
}
int main(){
char A[N]={"HOMEWORK:I am doing my homework.your homework!Homework?oh"},B[N]={"Homework"};
int C[N],i;
BF(A,B,C);
printf("B字符串在A中个共 %d个 <忽略大小写>\n匹配的数组下标:\n",C[0]);
if(C[0])
for(i=1;i<=C[0];i++)
printf("%d ",C[i]);
printf("\n");
return 0;
}