前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KMP算法(看毛片算法)

KMP算法(看毛片算法)

作者头像
Hongten
发布2018-09-13 15:37:59
1.1K0
发布2018-09-13 15:37:59
举报
文章被收录于专栏:Hongten

这里是KMP算法的原文:http://www.cnblogs.com/huangxincheng/archive/2012/12/01/2796993.html

我根据原文理解,修改为java版的....

"那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输入法总是提示“看毛片”三个字,嘿嘿,就叫“看毛片算法”吧。"

我这边也是:

多的就不用说了,直接上代码:

代码语言:javascript
复制
 1 /**
 2  * 
 3  */
 4 package com.b510;
 5 
 6 /**
 7  * kmp算法
 8  * 
 9  * @date 2012-12-1 <br />
10  * @author hongten(hongtenzone@foxmail.com)
11  * 
12  */
13 public class KMPAlgorithm {
14 
15     public static void main(String[] args) {
16         // ababcabababdc
17         String[] zstr = { "a", "b", "a", "b", "c", "a", "b", "a", "b", "a", "b", "d", "c" };
18         // babdc
19         String[] mstr = { "b", "a", "b", "d", "c" };
20 
21         int index = KMP(zstr, mstr);
22 
23         if (index == -1) {
24             System.out.println("没有匹配的字符串!");
25         } else {
26             System.out.println("哈哈,找到字符啦,位置为:" + index);
27         }
28     }
29 
30     public static int KMP(String[] bigstr, String[] smallstr) {
31         int i = 0;
32         int j = 0;
33 
34         // 计算“前缀串”和“后缀串“的next
35         int[] next = GetNextVal(smallstr);
36 
37         while (i < bigstr.length && j < smallstr.length) {
38             if (j == -1 || bigstr[i] == smallstr[j]) {
39                 i++;
40                 j++;
41             } else {
42                 j = next[j];
43             }
44         }
45 
46         if (j == smallstr.length) {
47             return i - smallstr.length;
48         }
49 
50         return -1;
51     }
52 
53     public static int[] GetNextVal(String[] smallstr) {
54         // 前缀串起始位置("-1"是方便计算)
55         int k = -1;
56 
57         // 后缀串起始位置("-1"是方便计算)
58         int j = 0;
59 
60         int[] next = new int[smallstr.length];
61 
62         // 根据公式: j=0时,next[j]=-1
63         next[j] = -1;
64 
65         while (j < smallstr.length - 1) {
66             if (k == -1 || smallstr[k] == smallstr[j]) {
67                 // pk=pj的情况: next[j+1]=k+1 => next[j+1]=next[j]+1
68                 next[++j] = ++k;
69             } else {
70                 // pk != pj 的情况:我们递推 k=next[k];
71                 // 要么找到,要么k=-1中止
72                 k = next[k];
73             }
74         }
75         return next;
76     }
77 
78 }

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-12-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档