[时空权衡]字符串匹配KMP算法代码(引自算法导论)
2011-05-12 01:20
555 查看
这里只贴一份来自《算法导论》的伪代码改写的代码。
void KMP_prefix( const char *t, int *next )
{
int len = strlen(t) ;
int i, j = -1 ;
next[0] = -1 ;
//请读者自行思考i什么时候增长
for( i=1; i<len; ++i )
{
//i永远和j+1位的比较(因为j初始值为-1)
//如果失配就执行跳转。直到j为-1为止。
while( (j+1>0)&&(t[j+1]!=t[i]) )
j = next[j] ;
//如果匹配,则两个串的指针都增长
if( t[j+1]==t[i] )
++j ;
//这句很抽象,意思是:
//跳转的位置永远是匹配成功的下一位
//也是唯一给跳转表赋值的一句
next[i] = j+1 ;
}
}
//主函数:可以看出这个函数与上面的函数极其相似
int KMP_matcher( const char *s, const char *t, int beg )
{
int l1 = strlen(s), l2 = strlen(t) ;
int *next = new int[l2] ;
KMP_prefix( t, next ) ;
int i, j = -1, ans = beg ;
for( i=beg; i<l1; ++i )
{
while( (j+1>0)&&(t[j+1]!=s[i]) )
{
j = next[j] ;
}
if( t[j+1]==s[i] )
{
++j ;
}
if( j+1==l2 )
{
ans = i-l2+1 ;
break ;
}
}
return ans ;
}
void KMP_prefix( const char *t, int *next )
{
int len = strlen(t) ;
int i, j = -1 ;
next[0] = -1 ;
//请读者自行思考i什么时候增长
for( i=1; i<len; ++i )
{
//i永远和j+1位的比较(因为j初始值为-1)
//如果失配就执行跳转。直到j为-1为止。
while( (j+1>0)&&(t[j+1]!=t[i]) )
j = next[j] ;
//如果匹配,则两个串的指针都增长
if( t[j+1]==t[i] )
++j ;
//这句很抽象,意思是:
//跳转的位置永远是匹配成功的下一位
//也是唯一给跳转表赋值的一句
next[i] = j+1 ;
}
}
//主函数:可以看出这个函数与上面的函数极其相似
int KMP_matcher( const char *s, const char *t, int beg )
{
int l1 = strlen(s), l2 = strlen(t) ;
int *next = new int[l2] ;
KMP_prefix( t, next ) ;
int i, j = -1, ans = beg ;
for( i=beg; i<l1; ++i )
{
while( (j+1>0)&&(t[j+1]!=s[i]) )
{
j = next[j] ;
}
if( t[j+1]==s[i] )
{
++j ;
}
if( j+1==l2 )
{
ans = i-l2+1 ;
break ;
}
}
return ans ;
}
相关文章推荐
- [时空权衡]字符串匹配算法 KMP
- 算法 字符串匹配之朴素算法和KMP算法及JAVA代码实现
- [算法与数据结构] - No.11 字符串匹配KMP算法
- 字符串匹配算法--KMP算法
- 【算法导论】字符串匹配
- 字符串匹配算法之KMP算法
- 字符串匹配算法--BF算法(暴力破解法)+KMP算法
- 字符串匹配算法——KMP算法
- KMP字符串匹配算法--算法导论示例zz
- 【算法】字符串匹配的KMP算法
- 【算法与数据结构】字符串匹配之KMP算法
- 字符串匹配KMP算法C++代码实现
- 字符串匹配算法——KMP算法
- 最长字符串匹配算法(KMP算法)
- LeetCode Implement strStr()(朴素的字符串匹配,RK算法,KMP算法)
- 字符串匹配高效算法 KMP-c++代码
- 【数据结构与算法】字符串匹配KMP算法
- 传统字符串匹配算法--Brute Force算法的C代码实现
- 字符串匹配算法SMA 总结之三:KMP算法
- 时空权衡:利用额外的空间提高字符串匹配的速度