【请教O(n)算法】字符串中子串出现的次数问题

xiaosaner3 2009-04-17 08:56:36
第一行子串(长度不超过10000个字符)。
第二行母串(长度不超过1000000个字符)
输出子串在母串中出现的次数

时间限制:1000ms

例:

AATTAATTAA
AATTAATTAATTAA

2

----------------------------------------

求O(n)算法。。
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
niansiqiao 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaocha 的回复:]
算法应该没错,没有测试,如果结果正确,那就优化一下你的代码吧,
至少到处都是 strlen,字符串又长,很耗时的
[/Quote]

怎么解决的啊
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
谢谢大家。

还是自己解决了。
xiaocha 2009-04-17
  • 打赏
  • 举报
回复
算法应该没错,没有测试,如果结果正确,那就优化一下你的代码吧,
至少到处都是 strlen,字符串又长,很耗时的
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
UP
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
谁来帮帮我啊。
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
using namespace std;





int * next(char *temp)
{
int i,j;
int *next = new int[ strlen(temp) ];
next[0]=-1;
for(i=1; i < strlen(temp); i++)
{
j=next[i-1];
while(j>=0 && temp[i] != temp[j+1])
j=next[j];
if(temp[i]==temp[j+1]) next[i]=j+1;
else next[i]=-1;
}
return next;
}

void KMP(char* a,char *b,int *next)
{
int i=0,j=0;
int n=0;
while(i<strlen(a))
{
while(i<strlen(a) && j<strlen(b))
{
if(a[i]==b[j])
{
i++;j++;
}
else if(j==0) i++;
else j = next[j-1] + 1;
}
if(j>=strlen(b)) //匹配啦
{
n++;

i = i - next[j-1] - 1;

j=0;
}


}
printf("%d\n" ,n);

}

int main()
{
char a[10001];
char b[1000001];
int t;
cin>>t;
for(;t>0;t--)
{
cin>>a>>b;
KMP(b,a, next(a) );


}
return 0;
}


这是我的源码 超时了。

5搂大哥,能不能把具体的贴上来?
  • 打赏
  • 举报
回复
KMP的时间复杂度基本就是O(n)啊.(因为你这里母串原长于子串).

难道KMP也能超时?
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
谢谢你的回答

不过这个算法会超时。

因为数据很大的。
xiaosaner3 2009-04-17
  • 打赏
  • 举报
回复
谢谢你的回答

不过这个算法会超时。

因为数据很大的。
goodname 2009-04-17
  • 打赏
  • 举报
回复
算法的东西俺是搞不来了,不过推荐一篇文章,希望能有所帮助。

http://www.cppblog.com/djxzh/archive/2009/02/06/73125.html
一篇介绍字符串匹配的综述
loud1984 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaosaner3 的帖子:]
第一行子串(长度不超过10000个字符)。
第二行母串(长度不超过1000000个字符)
输出子串在母串中出现的次数

时间限制:1000ms

例:

AATTAATTAA
AATTAATTAATTAA

2

----------------------------------------

求O(n)算法。。
[/Quote]这个我觉得比较容易。设定一个位置信息指针,开始为0,然后从母串中截取同字串长度一样的字符串进行比较,计数结果,然后指针向前移动一位,再重复前面步骤,直到指针小于母串长度-字串长度

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧