您的位置:首页 > 其它

KMP 字符串匹配算法

2007-07-14 19:32 316 查看

#include "stdafx.h"


#include <string.h>


#include <iostream>


#include <vector>


using namespace std ;




//模式匹配,kmp算法,复杂度O(m+n)


//返回匹配位置,-1表示匹配失败,传入匹配串和模式串和长度


//可更改元素类型,更换匹配函数




#define MAXN 100


#define _match(a,b) ((a)==(b))


typedef char elem_t;




int kmp_match(int ls,elem_t* str,int lp,elem_t* pat)




...{




int fail[MAXN]=...{-1}, i=0,j;


for (j=1;j<lp;)




...{


if(pat[i]!=pat[j] )




...{


fail[j++]=-1 ;


continue ;


}


for(i=0; j<lp && _match(pat[i],pat[j]) ; fail[j++]=i++) ;


}




for (i=j=0;i<ls&&j<lp;i++)




...{


if (_match(str[i],pat[j]))


j++;


else if (j)


j=fail[j-1]+1,i--;


}


return j==lp?(i-lp):-1;


}




int kmp(string str1, string str2)




...{


if(str1.size()<str2.size())


return -1 ;


size_t i, j ;


vector<int> fail ;


fail.resize(str2.size(),-1) ;




for(j=1, i=0; j<str2.size(); ++j)




...{


if(str2[j]!=str2[i])


continue ;


for(i=0; j<str2.size() && str2[j]==str2[i] ; fail[j++]=i++) ;


--j ;


}


for (i=j=0; i<str2.size() && j<str1.size(); ++j)




...{


if(str1[j]==str2[i])


++i ;


else if(i)


i=fail[i-1]+1, --j ;


}


return i==str2.size() ? j-i :-1 ;


}




int _tmain(int argc, _TCHAR* argv[])




...{


char * str1="abababababcabababa" ;


char * str2="ababababcab" ;


int i=kmp_match(strlen(str1),str1,strlen(str2),str2) ;


cout<<i<<endl ;


i=kmp(str1,str2) ;


cout<<i<<endl ;


getchar() ;


return 0;


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: