KMP算法

#include <iostream>
#include <stdlib.h>
void find(char *p,char *q,int &i,int &j)
 {int m,k,n,flog=0;
  m=i;//////////
  n=0;///////////
  while(*(q+n)!=*(p+i)&&n<j)  n++;
     j=n-1;
    
   if(*(q+n)==*(p+i))
   { flog=1;
    for(k=n-1;k>=0;k--)//////////判断前*(P—1)与前*(Q+N)是否也相等
      if(*(q+n-1)==*(p+i-1)) {n--;i--;}
      else  flog=0;
     }/////////////////if
    i=m;
    if(flog==0||n==0)  j=0;   
     
   }////////////////////find
    
  /////////////////////////////////////////////////////////////////////////////////////

 

int main(int argc, char *argv[])
{
  char str[100];
  char str1[50];
    int i,j;
    cin>>str;/////////////////////输入主串
    cin>>str1;///////////////////////////输入子串
    
  i=j=0;
  while(str[i])
   { while(str[i]==str1[j]&& str[i]!='/0')  {i++;j++;}
       
        cout<<i<<j<<endl;//////////不相等的位置
       
     if(str1[j]=='/0')  {cout<<"找到子窜的位置是"<<i-j<<endl;break;}
      else
      {
        if(str1[j]==str1[0])  i++;//////////////////比较第一个就不等
        else
          find(str,str1,i,j);//////////////////////回溯I和J的值
      }   ////////////////////else 
  
   }//////////////////while
 
  if(str1[j]!='/0')  cout<<"没找到相应子串"<<endl;
 
  system("PAUSE"); 
  return 0;
}//////////////////////main
 

呵呵,既然老师说考研会考这算法,就写了下,感觉不够简练。。肯定也有漏洞的,,我这人老是丢三落四……

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值