KMP算法学习笔记

来源:互联网 发布:传智播客c语言讲义 编辑:程序博客网 时间:2024/05/21 17:04
<pre name="code" class="java"><pre class="cpp" name="code">//字符串匹配的暴力算法/*文本串 S  匹配到 i模式串 P  匹配到 j匹配成功(S[i]==P[j]),  i++,j++  继续匹配下一个失配(S[i]!=P[j]), i=i-(j-1),j=0   i回溯, j置0*/#include<stdio.h>#include<string.h>//暴力匹配算法int ViolenMatch(char* s,char* p){int slen = strlen(s);//文本串长度int plen = strlen(p);//模式串长度int i = 0;//文本串匹配位置int j = 0;//模式串匹配长度while(i < slen && j < plen){if(s[i] == p[j]){//当前字符匹配成功i++;j++;}else{//匹配失败,i回溯,j置0i = i - j + 1;j = 0;}}//end while //匹配完成,返回模式串p在文本串中的位置,否则返回-1if(j == plen)return i - j;//elsereturn -1;}//KMPint KmpSearch(char* s,char* p){int i = 0;int j = 0;int slen = strlen(s);int plen = strlen(p);while(i < slen && j < plen){//如果j == -1 或当前字符匹配成功 s[i] == p[i], 则i++,j++if(j==-1 || s[i]==p[j]){i++;j++;}else{//如果j != -1 , 且当前字符匹配失败 s[i] != p[j]//则 i 不变 ,j = next[j]//next[j] 即为 j 所对应的next值j = next[j];}}//end while if(j == plen)return i - j;else return -1;}//NEXT[] 计算方法void GetNext(char* p,int next[]){int pLen = strlen(p);next[0] = -1;int k = -1;int j = 0;while (j < pLen - 1){//p[k]表示前缀,p[j]表示后缀if (k == -1 || p[j] == p[k]) {++k;++j;next[j] = k;}else {k = next[k];}}}void main(){printf("%d \n",ViolenMatch("abcabcd","abcd"));//3printf("%d \n",ViolenMatch("BBC ABCDAB ABCDABCDABDE","ABCDABD"));//15}



参考博客:
http://blog.csdn.net/v_july_v/article/details/7041827
0 0
原创粉丝点击