码迷,mamicode.com
首页 > 其他好文 > 详细

KMP(Knuth–Morris–Pratt) Algorithm

时间:2015-04-26 07:00:15      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

文章 String S, 要查找的字符串 String W

重点:Get int T[] from W

用变量 c 来表示当前比较到的 W 中前面的字符,
i 表示当前要处理的 T 中的 index,
int[] T = new int[W.length];
T[0] = -1; T[1] = 0;
c=0; i=2

example:
array:    a    b    a    b    c    d    a    b    a    b    a    b
idx    :    0    1    2    3    4    5    6    7    8    9   10  11

case 1:  W[c] == W[i-1] --> T[i] = ++c; i++;
case 2:  W[c] != W[i-1] && c>0 --> c = T[c];
case 3: W[c] != W[i-1] && c==0 --> T[i] = 0; i++;

过程
array: a    b    a    b    c    d    a    b    a    b    a    b
idx    : 0    1    2    3    4    5    6    7    8    9   10  11

i: 2 3 4 5 5 6 7 8 9 10 11
case: 3 1 1 2 3 3 1 1 1 1 2
pre-c: 0 0 1 2 0 0 0 1 2 3 4
after-c: 0 1 2 0 0 0 1 2 3 4 2
比较: 0 & 0 0 & 2 1 & 3 2 & 4 0 & 4 0 & 5 0 & 6 1 & 7 2 & 8 3 & 9 4 & 10

 

最后 po 一段自己写的 leetcode 上 implement strStr() 的代码

 1 public class Solution {
 2     public int strStr(String haystack, String needle) {
 3         if (needle==null || needle.length()==0)
 4             return 0;
 5         int ndlen = needle.length();
 6         int hslen = haystack.length();
 7 
 8         if (ndlen==1) {
 9             int i=0;
10             char c = needle.charAt(0);
11             while (i<hslen) {
12                 if (haystack.charAt(i)==c) {
13                     return i;
14                 }
15                 i++;
16             }
17             return -1;
18         }
19 
20         int[] T = new int[ndlen];
21         T[0] = -1;
22         T[1] = 0;
23         int i=2, cnd=0;
24         while (i<ndlen) { 
25             if (needle.charAt(cnd)==needle.charAt(i-1)) { 
26                 cnd++; 
27                 T[i++] = cnd; 
28             } else if (cnd>0) {
29                 cnd = T[cnd];
30             } else {
31                 T[i++] = 0;
32             }
33         }
34 
35         int ndidx=0, hsidx=0;
36         while (hsidx<hslen) {
37             if (haystack.charAt(hsidx)==needle.charAt(ndidx)) {
38                 hsidx++;
39                 ndidx++;
40                 if (ndidx == ndlen) {
41                     return hsidx-ndlen;
42                 }
43             } else if (T[ndidx]!=-1) {
44                 ndidx = T[ndidx];
45             } else {
46                 hsidx++;
47             }
48         }
49         return -1;
50     }
51 }

 

KMP(Knuth–Morris–Pratt) Algorithm

标签:

原文地址:http://www.cnblogs.com/joycelee/p/4457272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!