关闭

字符串搜索

标签: 算法
215人阅读 评论(0) 收藏 举报
分类:

字符串搜索是一种非常常见的应用,暴力搜索是直接去匹配各个字符,但是这种方法对于重复度较高的字符串来说,有点浪费计算了。KMP算法利用子串本身的特性,试图建立一种状态机,指出匹配到当前字符串的状态如何。http://blog.csdn.net/thesby/article/details/51243270

Next数组怎么求?

next数组的求解方法是:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。

这样的描述好像不太容易理解,我们可以直接看一个例子。
1 2 3 4 5 6 7 8
a b a a b c a c
所以,第一步的next
1 2 3 4 5 6 7 8
a b a a b c a c
0 1
第二步,看第三位的前一个是b,它与自己next位置1的字符a比较,不相等,所以他就是1了。
接下来,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1
第三步,看第三个字符a,可见它与自己next对应的是相等的,那就是在此基础上+1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2
第四步,第四个字符的a和它对应的next位置2的b不等,所以它就是再和2位置b的next比较,此时相等了,那么就是2了,所以
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2
第五步,第五个字符b和自己对应next字符相等,所以+1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3
第六步,第六个字符c没有与前面的重复,所以第七个位置的next就是1,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3 1
最后一个,看第七个是a,它对应next位置字符刚好和它相等,所以第八个next就是2了,
1 2 3 4 5 6 7 8
a b a a b c a c
0 1 1 2 2 3 1 2

参考了http://blog.csdn.net/quitepig/article/details/7933977

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:141831次
    • 积分:2157
    • 等级:
    • 排名:第17571名
    • 原创:69篇
    • 转载:10篇
    • 译文:8篇
    • 评论:52条
    文章分类
    最新评论