posts - 195,  comments - 30,  trackbacks - 0
本文是结合刘大有主编《数据结构》所写笔记,如果想学习kmp.推荐http://blog.csdn.net/china8848/archive/2008/04/29/2342243.aspx
下面的估计我都看不懂
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int f[100];
void createf(string pat)//find数组
{
 memset(f,0,sizeof(f));
 int m=pat.size();
 f[0]=-1;
 for(int j=1;j<m;j++)
 {
  int i=f[j-1];
  while(pat[j]!=pat[i+1]&&i>=0)//只要p[j]与p[i+1]不等,则递推计算i
  i=f[i];
  if(pat[j]==pat[i+1])
  f[j]=i+1;
  else
  f[j]=-1;
 }
}
/*                        已知f[13]=6;acbacbcacbacb,求f[14]acbacbcacbacba则先判断pat[6+1]是否等于pat[14],不等
                                再判断 i=f[6]acbacb=3;判断pat[14]pat[3+1]相等,则i=3
                           可得f[j]=3+1;         

*/
int kmp(string pat,string str)//求pat在str中的第一个匹配的起点
{
 int p=0,s=0;
 createf(pat);
 int m=pat.size();
 int n=str.size();
 while(p<m&&s<n)
 {
  if(pat[p]==str[s])
  {
   p++;s++;
  }
  else
  {
  if(p==0)s++;
  else
  p=f[p-1]+1;//s无需变化,举例,abababababba
/*                                                          |
                                                             s指向a
                                                     ababb
//                                                           |
//                                                           p指向b,s和p失配

                                                    abababababba
//                                                          |
                                                            s  s不变
  由于ab=ab,既f[p-1]=2               ababb
//     p=f[p-1]+1=3                                |
//                                                          p  回到f[p-1]+1的位置;


相等,则s和p都加1.
//
*/
}
 }
     if(p<m)
     return -1;
     return s-m;
}

  int main()
  {
  //freopen("s.txt","r",stdin);
  //freopen("key.txt","w",stdout);
  cout<<kmp("fgfh","abcabfgfdhsfgfhdfdfhfcdab");//返回的是数组下标,从0开始
  getchar();
  //system("PAUSE");
  return   0;
  }

改进的kmp
----------------------以下是原kmp生成next值的算法---------------------
void createf(string pat)//find数组
{
 memset(f,0,sizeof(f));
 int m=pat.size();
 f[0]=-1;
 for(int j=1;j<m;j++)
 {
  int i=f[j-1];
  while(pat[j]!=pat[i+1]&&i>=0)//只要p[j]与p[i+1]不等,则递推计算i
  i=f[i];
  if(pat[j]==pat[i+1])
  f[j]=i+1;
  else
  f[j]=-1;
 }
}
/*                        已知f[13]=6;acbacbcacbacb,求f[14]acbacbcacbacba则先判断pat[6+1]是否等于pat[14],不等
                                再判断 i=f[6]acbacb=3;判断pat[14]pat[3+1]相等,则i=3
                           可得f[j]=3+1;         

*/
-------------------以下还是未改进kmp------------
void get_next(String T,int &next[])
{
  i=1;j=0;next[1]=0;
  while(i<=T.Length)
  {
    if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}
    else j=next[j];
  }
}

--------------------以下是改进型----------
上面的f[j]相当于next[]
 int i,j,len,n;
        len=strlen(s);
        //KMP构造
        i=0,j=-1;
        next[0]=-1;
        while(i<len)
       {
            if(j==-1||s[i]==s[j])
           {
                i++,j++;
                if(s[i]!=s[j])
                   next[i]=j;                                                                     
                else
                   next[i]=next[j];
            //    printf("next[%d]=%d\n",i,next[i]);
            }
           else j=next[j];
        }

posted on 2009-06-30 14:12 luis 阅读(610) 评论(0)  编辑 收藏 引用 所属分类: 规律

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜