int KMP(const char *original, int o_len, const char *substring, int s_len){
if(o_len < s_len)
return -1;
int k = 0;
int cur = 1;
int fail[ s_len ];
fail[ k ] = -1;
while(cur < s_len){
k = cur - 1;
do{
if(substring[ cur ] == substring[ k ]){
fail[ cur ] = k;
break;
}else{
k = fail[ k ] + 1;
}
}while(k);
if(!k && (substring[ cur ] != substring[ 0 ])){
fail[ cur ] = -1;
}else if(!k){
fail[ cur ] = 0;
}
cur++;
}
k = 0;
cur = 0;
while((k < s_len) && (cur < o_len)){
if(original[ cur ] == substring[ k ]){
cur++;
k++;
}else{
if(k == 0){
cur++;
}else{
k = fail[ k - 1 ] + 1;
}
}
}
if(k == s_len)
return cur - k;
else
return -1;
}
这是我曾经编码过的KMP算法。当我今天上午审查它时,我发现奇怪的是整数数组被定义为int fail [s_len]。规范是否需要数组的编译时常量?这段代码如何通过编译? 顺便说一句,我的gcc版本是4.4.1。 在此先感谢!以C语言约束阵列维数