关于C语言OJ的一个问题:超过了时间限制

调试您的代码。

有两个问题:

如果ori字符串本身比pat短,则不需要匹配,直接结果为0。

如果已经匹配了I个字符,测试的第四组号是pat从开始匹配,但实际上是从pat下标为3的地方匹配。

最后,代码太多,逻辑判断影响速度,附带KMP函数代码。

int?KMP(查尔?*ori,?夏尔?*pat)

{

夏尔?*温度?* p;

int?num?=?strlen(帕特);

int?我?=?0,?j?=?0;

int?*下一个;

int?sum?=?0;

//查找下一个数组

下一个?=?(int?*)malloc((num?+?1)* sizeof(int));

memset((int?*)接下来,?0,?(num?+?1)* sizeof(int));

p?=?临时工?=?拍拍;

pat++;

什么时候?(*帕特)

{

如果?(*帕特?==?*温度)

{

*(下一个?+?我?+?2)?=?j?+?1;

pat++;

temp++;

j++;

}

其他

{

pat++;

j?=?0;

}

i++;

}

//匹配字符串

帕特?=?p;

我?=?0;

什么时候?(*ori)

{

如果?(strlen(ori)?& lt?斯特伦(帕特))

打破;

如果?(*ori?==?*pat)

{

ori++;

pat++;

i++;

如果?(*帕特?==?'\0')

{

sum++;

帕特?=?p?+?下一个[我];

我?=?下一个[我];

}

}

其他

{

如果?(我?==?0)

ori++;

帕特?=?p?+?下一个[我];

我?=?下一个[我];

}

}

回归?总和;?

}接下来又申请了一个,主要是存储0匹配时对应的数字。