您的位置:首页 > 其它

[学习笔记]KMP的简单记忆方法

2010-10-19 20:48 411 查看
模式串的匹配是从左向右进行的。需要辅助数组next

next数据是当当前字符匹配失败后,模式串应当前移的距离。母字符串指针不回溯。
模式串先对自身进行匹配,计算当前位置上对应的最长匹配前缀子串(当前模式串位置的前一个位置开始查找,也就是不包括自己)

原子串aba
前移一位,无匹配aba
前移二位,有匹配aba
将匹配个数写入下一个字符对应的next中。

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: