[学习笔记]KMP的简单记忆方法
2010-10-19 20:48
411 查看
模式串的匹配是从左向右进行的。需要辅助数组next
next数据是当当前字符匹配失败后,模式串应当前移的距离。母字符串指针不回溯。
模式串先对自身进行匹配,计算当前位置上对应的最长匹配前缀子串(当前模式串位置的前一个位置开始查找,也就是不包括自己)
将匹配个数写入下一个字符对应的next中。
代码
start = 0;
match = -1;
while( start < data_length && match < substr_length )
{
if( match == -1 || data[start] == substr[match] )
{
++start;
++match;
}
else
match = next[match];
}
if( match == substr_length )
return start - match;
return -1;
next数据是当当前字符匹配失败后,模式串应当前移的距离。母字符串指针不回溯。
模式串先对自身进行匹配,计算当前位置上对应的最长匹配前缀子串(当前模式串位置的前一个位置开始查找,也就是不包括自己)
原子串 | a | b | a | ||
前移一位,无匹配 | a | b | a | ||
前移二位,有匹配 | a | b | a |
src | a | b | a | a | b | c | a | c |
Next0 | -1 | |||||||
Cur0 | * | 无匹配前缀子串,在下一个位置的next中写入0 | ||||||
Next1 | -1 | 0 | ||||||
Cur1 | * | 无匹配前缀子串,在下一个位置的next中写入0 | ||||||
Next2 | -1 | 0 | 0 | |||||
Cur2 | a | 有匹配前缀子串a下一位置next中写入1 | ||||||
Next3 | -1 | 0 | 0 | 1 | ||||
Cur3 | a | 匹配前缀子串a下一位置next写1 | ||||||
Next4 | -1 | 0 | 0 | 1 | 1 | |||
Cur4 | a | b | 子串ab下一位置next为2 | |||||
Next5 | -1 | 0 | 0 | 1 | 1 | 2 | ||
Cur5 | * | 无匹配 | ||||||
Next6 | -1 | 0 | 0 | 1 | 1 | 2 | 0 | |
Cur6 | a | 1个匹配 | ||||||
Next7 | -1 | 0 | 0 | 1 | 1 | 2 | 0 | 1 |
start = 0;
match = -1;
while( start < data_length && match < substr_length )
{
if( match == -1 || data[start] == substr[match] )
{
++start;
++match;
}
else
match = next[match];
}
if( match == substr_length )
return start - match;
return -1;
相关文章推荐
- [Erlang 学习笔记]Erlang 简单实现 KMP--字符串匹配算法
- 【知了堂学习笔记】Java中static关键字的一些简单使用方法
- APIDemo学习笔记——Android上几种简单的Animation使用方法(一)
- java学习笔记——jsp简单方法读取txt文本数据
- APIDemo学习笔记——Android上几种简单的Animation使用方法(二)
- 学习Altas 笔记[JS简单调用服务端方法]
- Design Pattern学习笔记之工厂(简单工厂、工厂方法、抽象工厂)
- 学习笔记:JAVA RMI远程方法调用简单实例
- 学习Altas 笔记[JS简单调用服务端方法]
- Androin学习笔记二十一:wifi的简单使用方法----获得本机或主机信息
- 【前端学习笔记】2015-09-08~~~~ 关于切图的简单方法
- 学习Altas 笔记[JS简单调用服务端方法]
- 简单工厂、工厂方法和抽象工厂的学习笔记
- 黑马程序员之JS学习笔记:简单的LINQ的查询语法和方法语法
- 【新手学习笔记】我总结的unity遍历所有子物体的两种简单方法
- 学习笔记:JAVA RMI远程方法调用简单实例
- 学习笔记:JAVA RMI远程方法调用简单实例
- PHP 学习笔记 - - - 简单方法的使用 (数组)
- 学习笔记:JAVA RMI远程方法调用简单实例
- 简单工厂、工厂方法和抽象工厂的学习笔记