标签:匹配 推导 需要 思想 amp turn ++ cpp char
int next[1024] = { -1 }; void MyNext(char *sub) { int len = strlen(sub); int k = -1; next[0] = -1; next[1] = 0; int j = 1; while (j <= len) { if (k == -1 || sub[k] == sub[j]) { k++; j++; next[j] = k; } else k = next[k]; } } int MyKMP(char *src, char *sub) { int src_len = strlen(src); int sub_len = strlen(sub); int i, j; i = j = 0; while (i < src_len && j<sub_len) { if (src[i] == sub[j]) { i++; j++; } else { i++; j = next[j]; } if (j == -1) j = 0; } if (j > sub_len) { return i - j; } return -1; }
KMP子串匹配算法精髓在确定next数组上,确定next数组注意以下几点:
试想next[j]=k,那么next[j+1]应该等于多少,如果string[j]=string[next[j]],那就说明,next[j+1]可以直接递归算出等于 next[j]+1
如果string[j] != string[next[j]],那么递归匹配string[j] != string[next【next【j】】,一直到next[0] +1=0。
标签:匹配 推导 需要 思想 amp turn ++ cpp char
原文地址:https://www.cnblogs.com/shawnc24/p/10419864.html