kmp

#include <iostream>
#include <string>
using namespace std;
void get_next(string ssub,int *next){

 int i=3;
 next[1]=0;next[2]=1;
 while(i<ssub.size()){
 
  int j=i-1;
  while(j>0){
  
   if(ssub[i-1]==ssub[next[j]]) {
    
    
    next[i]=next[i-1]+1;
    if(ssub[i]==ssub[next[i]]) next[i]=0;
    break;
   }
   else j=next[j];
  }
 }
}
int kmp(string smain,string ssub,int *next){

 int i=1,j=1;
 while(i<smain.size()&&j<ssub.size()){
 
  if(smain[i]==ssub[j]||j==0){
  
   ++i;++j;
  }
  else{
      j=next[j];
  }
  
 
 }
 if(j>=ssub.size())  return i-ssub.size();
 else return 0;
}
int main(){

 string smain=" abcacadaba";
 string ssub=" ad";
    int *next=new int[ssub.size()];
    get_next(ssub,next);
 int position=kmp(smain,ssub,next);
 cout<<position<<endl;
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值