字符串匹配算法(KMP算法c语言实现)
2011-02-23 16:43
302 查看
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*naive string-matching algorithm,T为原始字符串,P为需要匹配的字符串*/
void naiveMatch(char *T,char *P)
{
int lenT,lenP,i,j;
lenT=strlen(T);
lenP=strlen(P);
if(lenT<lenP)/*需要匹配的字符串比原始字符串还要长出错*/
{
perror("input error");
return ;
}
for(i=0;i<(lenT-lenP+1);i++)
{
for(j=0;j<lenP;j++)
{
if(T[i+j]!=P[j])
break;
}
if(j==lenP)
printf("string match at place %d/n",i);
}
}
/*kmp预处理需要的匹配串*/
void getNext(char *p,int next[])
{
int len,i,j;
len=strlen(p);
next[0]=0;
for(i=1;i<len;i++)
{
j=next[i-1];
while((p[i-1]!=p[j-1])&&(j!=0))
{
j=next[j-1];
// printf("j= %d/n",j);
}
next[i]=j+1;
printf("next[i]=%d/n",next[i]);
}
}
/*kmp字符串匹配算法*/
void kmp(char *t,char *p,int next[])
{
int lent,lenp,i,j;
lent=strlen(t);
lenp=strlen(p);
i=0;
j=0;
while(i<(lent))
{
if((j==-1)||(t[i]==p[j]))
{
i++;
j++;
// printf("i=%d,j=%d/n",i,j);
}
else
{
// printf("in else i=%d,j=%d/n",i,j);
j=next[j]-1;
}
if(j==(lenp))
{
printf("match at place %d/n",i-lenp);
}
}
}
int main()
{
char p[10]="0001";
char t[20]="000010001010001";
naiveMatch(t,p);/*测试普通字符串匹配算法*/
char p1[10]="abaabcac";
char t1[20]="acabaabaabcacaabc";
int len=strlen(p1);
int *next;
next=(int*)malloc(sizeof(int)*len);
getNext(p1,next);
kmp(t1,p1,next);/*测试kmp算法*/
getNext(p,next);
kmp(t,p,next);/*测试kmp算法*/
}
#include<stdlib.h>
#include<string.h>
/*naive string-matching algorithm,T为原始字符串,P为需要匹配的字符串*/
void naiveMatch(char *T,char *P)
{
int lenT,lenP,i,j;
lenT=strlen(T);
lenP=strlen(P);
if(lenT<lenP)/*需要匹配的字符串比原始字符串还要长出错*/
{
perror("input error");
return ;
}
for(i=0;i<(lenT-lenP+1);i++)
{
for(j=0;j<lenP;j++)
{
if(T[i+j]!=P[j])
break;
}
if(j==lenP)
printf("string match at place %d/n",i);
}
}
/*kmp预处理需要的匹配串*/
void getNext(char *p,int next[])
{
int len,i,j;
len=strlen(p);
next[0]=0;
for(i=1;i<len;i++)
{
j=next[i-1];
while((p[i-1]!=p[j-1])&&(j!=0))
{
j=next[j-1];
// printf("j= %d/n",j);
}
next[i]=j+1;
printf("next[i]=%d/n",next[i]);
}
}
/*kmp字符串匹配算法*/
void kmp(char *t,char *p,int next[])
{
int lent,lenp,i,j;
lent=strlen(t);
lenp=strlen(p);
i=0;
j=0;
while(i<(lent))
{
if((j==-1)||(t[i]==p[j]))
{
i++;
j++;
// printf("i=%d,j=%d/n",i,j);
}
else
{
// printf("in else i=%d,j=%d/n",i,j);
j=next[j]-1;
}
if(j==(lenp))
{
printf("match at place %d/n",i-lenp);
}
}
}
int main()
{
char p[10]="0001";
char t[20]="000010001010001";
naiveMatch(t,p);/*测试普通字符串匹配算法*/
char p1[10]="abaabcac";
char t1[20]="acabaabaabcacaabc";
int len=strlen(p1);
int *next;
next=(int*)malloc(sizeof(int)*len);
getNext(p1,next);
kmp(t1,p1,next);/*测试kmp算法*/
getNext(p,next);
kmp(t,p,next);/*测试kmp算法*/
}
相关文章推荐
- 字符串匹配算法(KMP算法c语言实现)
- 典型字符串匹配算法实现
- KMP、BM、Sunday等字符串匹配算法及实现
- Java实现 字符串匹配 KMP 算法
- 多模字符串匹配算法原理及Java实现代码
- 典型字符串匹配算法实现 - 单字符串匹配算法
- 字符串匹配问题 kmp算法C语言实现
- 字符串匹配算法之___Sunday算法的java实现
- 算法实现字符串匹配问题:从三个字符串中找出共有的最长部分。
- 算法串匹配C++实现字符串匹配的KMP算法
- KMP字符串匹配算法及C语言实现
- 算法 字符串匹配之朴素算法和KMP算法及JAVA代码实现
- 算法实现-->字符串匹配
- 多模字符串匹配算法之AC自动机—原理与实现
- 单模式字符串匹配算法---Tuned Boyer-Moore algorithm实现
- PHP实现的字符串匹配算法示例【sunday算法】
- Java实现算法导论中Rabin-Karp字符串匹配算法
- 算法导论-第32章-字符串匹配:Knuth-Morris-Pratt(KMP)算法C++实现
- php实现字符串匹配算法——sunday算法
- 常见的字符串匹配算法对比实现C语言版本