kmp
2014-12-08 10:19
435 查看
//优点: KMP算法巧妙的消除了指针的回溯问题,用一个next数组来确定了下一次
// j的匹配位置使得原问题的复杂度由O(mn)下降到了O(m+n)
//思想: 在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i
// 不变,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i
// 右移1位,并将j置0,继续进行比较。
//匹配实现代码如下:
#include <cstring>
const int N = 101;
int next
;
int ans = 0;
void getNext( char * p, int * next );
void kmp()
{
int len1 = strlen(s);
int len2 = strlen(p);
int i = 0, j = 0;
while ( i < len1 )
{
if ( j == -1 || s[i] == p[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
if ( j == len2 )
{
ans++;
j = next[j];
}
}
}
//可以看出,KMP算法的关键在于求算next
数组的值,即为
//求出模式串(p)每个位置处的最长的后缀与前缀相同的长度
//按照递推的思想来求:
//根据定义next[0] = -1。
//假设有next[j] = k, 即P[0...k-1] == P[j-k,j-1],则:
// 1)若P[j] == P[k],则有P[0..k] == P[j-k,j],很显然,next[j+1] = next[j] + 1 = k + 1;
// 2)若P[j] != P[k],则可以把其看做模式匹配的问题(P串的自匹配问题),
// 即匹配失败的时候,k = next[k]。
//实现代码如下:
void getNext()
{
int j = 0, k = -1;
next[0] = -1;
int len2 = strlen(p);
while ( j < len2 )
{
if ( k == -1 || p[k] == p[j] )
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
// j的匹配位置使得原问题的复杂度由O(mn)下降到了O(m+n)
//思想: 在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i
// 不变,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i
// 右移1位,并将j置0,继续进行比较。
//匹配实现代码如下:
#include <cstring>
const int N = 101;
int next
;
int ans = 0;
void getNext( char * p, int * next );
void kmp()
{
int len1 = strlen(s);
int len2 = strlen(p);
int i = 0, j = 0;
while ( i < len1 )
{
if ( j == -1 || s[i] == p[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
if ( j == len2 )
{
ans++;
j = next[j];
}
}
}
//可以看出,KMP算法的关键在于求算next
数组的值,即为
//求出模式串(p)每个位置处的最长的后缀与前缀相同的长度
//按照递推的思想来求:
//根据定义next[0] = -1。
//假设有next[j] = k, 即P[0...k-1] == P[j-k,j-1],则:
// 1)若P[j] == P[k],则有P[0..k] == P[j-k,j],很显然,next[j+1] = next[j] + 1 = k + 1;
// 2)若P[j] != P[k],则可以把其看做模式匹配的问题(P串的自匹配问题),
// 即匹配失败的时候,k = next[k]。
//实现代码如下:
void getNext()
{
int j = 0, k = -1;
next[0] = -1;
int len2 = strlen(p);
while ( j < len2 )
{
if ( k == -1 || p[k] == p[j] )
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
相关文章推荐
- 如何利用KMP的next求字符串的循环节
- 【经典算法】——KMP,深入讲解next数组的求解
- 【练习03】 KMP 1001 Number Sequence
- POJ-2752 Seek the Name, Seek the Fame(KMP)
- KMP hdu-2594 Simpsons’ Hidden Talents
- POJ 2406 Power Strings KMP 或者后缀数组
- hdu-1711-kmp
- POJ 3461 Oulipo (KMP)
- 字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组(转)
- POJ 2406 依然是KMP求循环节
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- POJ3974 回文串。EXKMP模板和马拉车算法模板
- poj3450之kmp入门
- KMP、BM、Sunday等字符串匹配算法及实现
- POJ3461_Oulipo_KMP_求重复子串的个数_可重叠
- lightoj 1268 Unlucky Strings (矩阵快速幂+kmp DFA 好题)
- HDU 3336 Count the string KMP
- KMP(字符串查找)(hihocoder)
- POJ 3450 Corporate Identity 暴力枚举+KMP
- HDU1358-Period(KMP)