串的模式匹配算法(KMP)
来源:互联网 发布:淘宝新开店铺提取王 编辑:程序博客网 时间:2024/05/17 23:55
算法:
#include<IOSTREAM>using namespace std;#define MAXSIZE 100void calNext(const char *T,int *next);//T为模式串,next为预判数组int kmp_match(const char *S,const char *T);//在主串S中寻找模式串T,如果找到返回其位置,否则返回-1。位置从0开始void calNext(const char *T,int *next){ int n = strlen(T); if(n <= 0) { return; } int j = 0,k = -1; next[0] = -1; while(j < n) { if(k==-1 || T[j]==T[k]) { j++; k++; next[j] = k; }else { k = next[k]; } }}int kmp_match(const char *S,const char *T){ if(S==NULL || T==NULL) { return -1; } int n = strlen(S);//主串长度 int m = strlen(T);//模式串长度 int next[MAXSIZE]; calNext(T,next); int i = 0,j = 0; while(i+m <= n) { for(;i<n&&j<m&&S[i]==T[j];++i,++j); if(j==m) return i-m; j = next[j]; if(j==-1) { j++; i++; } } return -1;}
注:
原理:利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置,有效位置即为所谓的next数组。
next数组计算过程:
声明next数组下标从0开始,定义next[0]=-1;模式串为T[]
假如求T中j+1位的next[j+1]
将其前一位的内容与其前一位的next值(next[j])的内容(T[next[j]])进行比较;
如果他们相等(T[j]==T[next[j]]),则next[j+1]=next[j]+1;
如果他们不相等,则继续向前比较,直到找到next值对应的内容与前一位相等为止,则在这个next值上加1;
如果直到第一位都没有与之相等,则next[j+1]=0
1 0
- 串的模式匹配算法(KMP)
- 串的模式匹配(BF算法,KMP算法)
- 串的模式匹配KMP算法
- 串的模式匹配 经典KMP算法
- 串的模式匹配KMP算法
- 串的模式匹配改进--KMP算法
- 串的模式匹配-KMP算法
- 串的模式匹配KMP算法模板
- 【数据结构】 串的模式匹配算法KMP
- 串的模式匹配---------kmp算法
- 串的模式匹配:KMP算法
- 串的模式匹配-KMP算法
- 串的模式匹配KMP算法
- KMP算法--串的模式匹配
- 串的模式匹配算法-KMP
- 串的模式匹配-KMP算法
- (11)串的模式匹配:朴素的模式匹配算法,KMP算法
- 数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)
- Asynchronous Servers in Python
- How many prime numbers
- 并查集向量偏移
- 关于多分项条件组合问题的解决
- 进制转换
- 串的模式匹配算法(KMP)
- 90. 啰唆的的日志会打断你的睡眠
- 设计模式目录
- 基于Spring MVC的Web应用开发(5) - Redirect
- hdu1698 Just a Hook
- adb shell dumpsys 命令
- 正则表达式的使用--去除字符串中空格
- Least Common Multiple
- 百思模组商城 - WWW.BESTMODULE.COM