用KMP算法我想要查找出主串s中的所有子串t1并用t2替换,但是在实现查找时为什么KMP算法只查找了一次,应该怎么修改

HW-0919 2015-04-11 05:12:36
比如char s[]="aaabaaaab";//主串s
char t1[]="aa";//子串t1
char t2[]="aaaab";//子串t2

应该查找次吧,怎么样才能有5个返回值呢?求教
代码如下:
#include<iostream>
#include<string>

using namespace std;

char s[]="aaabaaaab";//主串s
char t1[]="aa";//子串t1
char t2[]="aaaab";//子串t2



void get_next(char *t, int next[])//求解next数组
//next数组长度应大于或等于strlen(t)
{
int j, k;
next[0]=k=-1; j=1;
while(t[j])
if(k==-1||t[j-1]==t[k]) next[j++]=++k;
else k=next[k];
}

int index_kmp(char *s, char *t, int next[])
//要求next值已求取
{
int i=0,j=0;
while(s[i]&&t[j])
{
if(j==-1||s[i]==t[j])
{
//if(s[i]==t[j]) cout<<"i="<<i<<" ";
i++;
j++;
}
else j=next[j];
}
if(!t[j]) return i-j;//若匹配成功则函数返回和子串中第一个字符相等的字符在主串中的序号
return -1; //返回-1表示匹配失败
}

void main()
{
int n=0;
int next[10];
get_next(t2,next);
for(int i=0;i<=strlen(t2)-1;i++)
cout<<next[i]<<" ";
cout<<endl<<"KMP Success!"<<endl;
cout<<index_kmp(s,t2,next)<<" ";
cout<<endl;
}
...全文
523 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Heart09 2015-04-14
  • 打赏
  • 举报
回复
这个好办啊,每次查找成功的时候,用一个list记录找到的位置,然后将j置为-1,将i置为 i-len. 继续查找。 从上面描述,aaabaaaab,中要返回5个位置,所以,将i置为i-len,其中len为模式串t1的长度 如果返回3次,即不算重叠的t1,则,将i置为i+1,继续查找。
HW-0919 2015-04-11
  • 打赏
  • 举报
回复
补充一下应该是查找5次吧

65,189

社区成员

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

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