kmp 算法
1 void GetNextval(char[] p, int[] next) 2 { 3 int pLen = p.length; 4 next[0] = -1; 5 int k = -1; 6 int j = 0; 7 while(j < pLen-1) 8 { 9 // p[k]表示前缀,p[j]表示后缀 10 if(k == -1 || p[j] == p[k]) 11 { 12 ++j; 13 ++k; 14 15 if(p[j] != p[k]) 16 next[j] = k; 17 else 18 next[j] = next[k]; // 因为不能出现p[j] = p[next[j]),所以需要递归,k=next[k]=next[next[k]] 19 20 } 21 else 22 { 23 k = next[k]; 24 } 25 } 26 27 } 28 29 30 int KmpSearch(char[] dst, char[] mode, int[] next) 31 { 32 GetNextval(mode, next); 33 int i = 0, j = 0; 34 int sLen = dst.length; 35 int pLen = mode.length; 36 while(i < sLen && j < pLen) 37 { 38 if(j == -1 || dst[i] == mode[j]) 39 { 40 i++; 41 j++; 42 } 43 else 44 { 45 j = next[j]; 46 } 47 } 48 if(j == pLen) 49 return i - j; 50 else 51 return -1; 52 }
代码改自: http://blog.csdn.net/v_july_v/article/details/7041827