KMP(内含next数组讲解) —— 剪花布条 ( HDU 2087 )
2016-07-14 18:13
134 查看
关于KMP算法前缀next最同俗易懂的解释请看:
http://blog.csdn.net/yearn520/article/details/6729426
next数组代码:(将第一位赋值为-1,无重复位置赋值为0,重复位一次递增)
KMP匹配代码:(依赖上面的SetNex()函数)
练习:
http://acm.hdu.edu.cn/showproblem.php?pid=2087
分析&题解:
很裸的KMP,计算目标字符串中含有多少个子串。修改一下KMP函数,每匹配完成一次,计数++,直到匹配不了为止。
AC代码:
http://blog.csdn.net/yearn520/article/details/6729426
next数组代码:(将第一位赋值为-1,无重复位置赋值为0,重复位一次递增)
void SetNext()//子串的next数组,如果只看代码的话,很难得出值的确定方法。 { int i=0,j=-1; Next[0]=-1; while(i<M) { if(j==-1||b[i]==b[j])//b为模式数组 { i++; j++; Next[i]=j; } else j=Next[j]; } }
KMP匹配代码:(依赖上面的SetNex()函数)
int Kmp() { int i=0,j=0; SetNext(); while(i<N)//a为目标数组 { if(j==-1||a[i]==b[j])//这里j=-1的情况就是第一个字符不匹配的情况。 { i++;j++; } else j=Next[j];//如果匹配不上,这里回溯j, if(j==M)//如果匹配成功了。 return i-j+1;//回溯j最终的位子。 } return -1; }
练习:
http://acm.hdu.edu.cn/showproblem.php?pid=2087
分析&题解:
很裸的KMP,计算目标字符串中含有多少个子串。修改一下KMP函数,每匹配完成一次,计数++,直到匹配不了为止。
AC代码:
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> using namespace std; int N,M; char a[1234]; char b[1234]; int Next[1234]; int cnt ; void SetNext()//子串的next数组,如果只看代码的话,很难得出值的确定方法。 { int i=0,j=-1; Next[0]=-1; while(i<M) { if(j== -1||b[i]==b[j]) { i++; j++; Next[i]=j; } else j=Next[j]; } } void Kmp() { int i=0,j=0; SetNext(); while(i<N) { if(j== -1||a[i]==b[j])//这里j=-1的情况就是第一个字符不匹配的情况。 { i++;j++; } else j=Next[j];//如果匹配不上,这里回溯j, if(j==M)//如果匹配成功了。 { j = 0; cnt++; } } return ; } int main() { while(scanf("%s", &a) ) { if(a[0] == '#') break; cnt = 0; scanf("%s", &b); N = strlen(a); M = strlen(b); SetNext(); Kmp(); cout << cnt << endl; } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法