代码改变世界

实用算法实践-第 22 篇 字符串匹配

2012-01-10 22:53  myjava2  阅读(124)  评论(0编辑  收藏  举报

22.1    Knuth-Morris-Pratt算法

22.1.1   实例

PKU JudgeOnline, 3461, Oulipo.

22.1.2   问题描述

求字符串在另外一个字符串中出现了几次。

22.1.3   输入

3

BAPC

BAPC

AZA

AZAZAZA

VERDI

AVERDXIVYERDIAN

22.1.4   输出

1

3

0

22.1.5   分析

标准的KMP算法解决的问题。将KMP的伪代码一翻译就出来了。

22.1.6   程序

22.2    Knuth-Morris-Pratt算法的前缀函数的应用

22.2.1   实例

PKU JudgeOnline, 2752, Seek the Name, Seek the Fame.

22.2.2   问题描述

输出一个字符串中所有前缀、后缀相等的长度。

22.2.3   输入

ababcababababcabab

aaaaa

22.2.4   输出

24 9 18

12 3 4 5

22.2.5   分析

该题的题意是这样的,给若干个字符串,判断该字符串前n个字符和后n个字符是否相同,按从小到大的顺序输出n,比如,给ababab,结果输出2 4 6,再比如ababcababababcabab 输出 2 4 9 18。

我们要根据kmp算法中的next函数来解决这个问题,以ababab为例加以说明:

String:ababab

Next: 0112345

这里根据后面的需要多计算了一位next值。

我们用ababab即作为主串有作为模式串来进行匹配,假设匹配到第7位时不匹配了(下标中1开始),要根据next[7](=5)的值继续匹配:

ababab*

ababab&

ababab*

 ababab

可以由5得出4(5-1)是符合要求的,然后求next[5]=3,即继续这样匹配:

ababab*

 ababab

可以由5得出2(3-1)是符合要求的,然后求next[3]=1,停止循环。

这样,我们依此输出2 4 6即可。

22.2.6   程序

22.3    实例

PKU JudgeOnline, 2752, Seek the Name, Seek the Fame.

PKU JudgeOnline, 1961, Period.

PKU JudgeOnline, 2406, Power Strings.

PKU JudgeOnline, 3461, Oulipo.

本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article