关于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匹配时对应的数字。