KMP模板
来源:互联网 发布:得力33113考勤软件 编辑:程序博客网 时间:2024/06/03 12:55
示例: a b a b a c a
next -1 -1 0 1 2 -1 0
求出next数组在匹配时起减少跳跃次数的作用
void get_next(char *str, int *next, int len){ next[0] = -1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀 int k = -1;//k初始化为-1 for (int q = 1; q <= len-1; q++) { while (k > -1 && str[k + 1] != str[q])//如果下一个不同,那么k就变成next[k],注意next[k]是小于k的,无论k取任何值。 { k = next[k];//往前回溯 } if (str[k + 1] == str[q])//如果相同,k++ { k = k + 1; } next[q] = k;//这个是把算的k的值(就是相同的最大前缀和最大后缀长)赋给next[q] }}
KMP
int KMP(char *str, int slen, char *ptr, int plen){ int *next = new int[plen]; get_next(ptr, next, plen);//计算next数组 int k = -1; for (int i = 0; i < slen; i++) { while (k >-1&& ptr[k + 1] != str[i])//ptr和str不匹配,且k>-1(表示ptr和str有部分匹配) k = next[k];//往前回溯 if (ptr[k + 1] == str[i]) k = k + 1; if (k == plen-1)//说明k移动到ptr的最末端 { //cout << "在位置" << i-plen+1<< endl; //k = -1;//重新初始化,寻找下一个 //i = i - plen + 2;//i定位到找到位置处的下一个位置(这里默认存在两个匹配字符串可以部分重叠) return i-plen+1;//返回相应的位置 } } return -1; }
注意如果str里有多个匹配ptr的字符串,要想求出所有的满足要求的下标位置,在KMP算法需要稍微修改一下。见上面注释掉的代码。
详见原创
阅读全文
0 0
- KMP模板
- KMP 模板
- kmp模板
- kmp模板
- kmp模板
- KMP模板
- kmp模板
- kmp模板
- KMP 模板
- 【模板】KMP
- KMP模板
- KMP模板
- 【KMP 模板】
- KMP模板
- KMP 模板
- kmp模板
- KMP模板
- KMP 模板
- 算法+优化方案(一)
- Spring MVC 访问静态资源的方法
- Mybatis学习第二天
- python3.5+selenium3.4自动化测试3_下拉框循环选择
- 数据结构-顺序队列解决最短迷宫路径问题
- KMP模板
- 用户权限管理系统的过滤器的优化
- TyvjP1045 最大的算式
- BZOJ3864 Hero meet devil
- 转载的Android studio 结构
- Kafka更新offset,scala反射调用进行测试
- 【算法题】买苹果
- 104-信号引起的竞争错误
- Jedis中hset散列相关操作