// +-------+---+-+ // | ... |i-1|i| 求Next(array, i) // +-------+---+-+ // X // / \ -------+ // / \ | | // / \ | | // 若i-1前面 +---+| |---|v|---|---| 若i-1之前有元素, // 无元素 | i-1| |...|j|...|i-1| 求得j=Next(j-1), // 返回 +----| |---|-|---|-|-| 比较array[i-1]与array[j] // / / \ | // / / \ |----| // / / \ | // 0 j+1 ------|v|---- 若array[i-1]与array[j]不等, // | ... |j|j+1| 用array[i-1]替换array[j] // +-----+-+---- 再求Next(array, j+1) #include <stdio.h> #include <string.h> int Next(char array[], int i) { int ret = 0; if ( 0 == i ) ret = -1; else if ( i == 1 ) ret = 0; else { int j = 0; int t = 0; j = Next( array, i-1); if ( array[j] == array[i-1] ) ret = j+1; else { t = array[i-1]; array[i-1] = array[j]; array[j] = t; ret = Next(array, j+1); t = array[i-1]; array[i-1] = array[j]; array[j] = t; } } return ret; } void main() { int i = 0; char str[] = "abaabcac"; for ( i=0; i<strlen(str); i++ ) printf("%d ", Next(str, i)); }
KMP算法next数组递归求法
最新推荐文章于 2022-10-09 14:46:21 发布