标签:
文章 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