字符串_模式匹配算法(求子串)

来源:互联网 发布:js压缩 tomcat 编辑:程序博客网 时间:2024/05/20 10:20

【声明】截图内容出于《数据结构》C语言版 严蔚敏;其余为原创

1、子串定位函数



步骤描述:

遍历主串S,并与子串T进行匹配。

        指针i,j分别表示主串和子串的当前遍历位置

if(S[i]==T[j]),真,则指针加1;直到子串遍历结束 j=strlen(T),说明匹配成功,返回成功子串的起始位置,即 i-strlen;

若假,则匹配失败,指针i从主串的下一个字符开始遍历,即 i=i-j+1;指针j回到初始位置  j=0;

代码:


时间复杂度:最好 O(n+m)  最坏O(n*m) 

2、KMP算法

克努特-莫里斯-普拉特算法(KMP算法),模式匹配的一种改进算法。借助“部分匹配”结果,将子串尽可能多的向右移动。



求部分匹配的next[i] 函数



代码:

void getNext(int *&next,char * T,int len){next[0]=-1;for(int j=1;j<len;++j){next[j]=0;int k=j-2;while(k>=0){for(int i=0;i<k;i++){if(T[i]!=T[j-k+i]) break;}if(i==k){next[j]=k;break;}--k;}}}

KMP算法代码:





0 0