KMP算法next数组递归求法

// +-------+---+-+ // | ... |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)); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值