关闭

kmp字符查找

标签: iostreamsystem
215人阅读 评论(0) 收藏 举报
 
/*
002 作者:小马过河
003 */
004 #include <iostream>
005 #include <string.h>
006 using namespace std;
007   
008 int Kmp(char father_str[],char son_str[],int next[]);  //next为son_str的next[j] 
009 int Next(char son_str[],int next[]);       //求son_str模式串的next[j] 
010   
011 int main()
012 {
013     int n = 0;
014     char *f = "abcdeefghij";
015     char *s = "aaaba";
016     n = strlen(s);
017     int next[n];
018      
019     Next(s,next);
020     cout<<"next的值如下:"<<endl;
021     for (int i=0; i<n; i++)
022     {
023        cout<<next[i]<<endl;
024     }
025     cout<<endl;
026     int pos = Kmp(f,s,next);
027     cout<<"pos = "<<pos<<endl;
028     system("pause");
029     return 0;
030 }
031   
032 int Kmp(char father_str[],char son_str[],int next[])
033 {
034     int i = 0;
035     int j = 0;
036     int pos = -1;
037     //求的主串和模式串的长度 
038     int lenfather = strlen(father_str);
039     int lenson = strlen(son_str);
040      
041     //提出不符合匹配的情况 
042     if (lenfather ==0 || lenson == 0 || lenson>lenfather)
043     {
044         return pos;
045     
046     int ncount = 0;
047     while (i<lenfather && j<lenson)
048     {
049           cout<<ncount<<": "<<"i="<<i<<"  j="<<j<<endl;
050           ncount++;
051           if (j==-1 || father_str[i] == son_str[j])
052           {
053               i++;
054               j++;
055           }
056           else
057           {
058               j = next[j];
059           }
060     
061     cout<<"j="<<j<<endl;
062     if (j>=lenson-1)
063     {
064         pos = i-lenson;
065     }
066     else
067     {
068         pos = -1;
069     }
070     return pos;
071 }
072   
073 //求son_str模式串的每一位next[j]值并保存在next里面  它和主串没有关系,和要找的串有关系 
074 /***
075 next[j]意义:规定next[0]=-1或其他的值,next[j]就是求模式串son[j]中前面有多少已经匹配的字符
076 举例:
077 t = aaab
078 j = 0: next[0]=-1
079 j = 1: next[1]=0
080 j = 2: t0=t1 next[2] = 1
081 j = 3: t0t1 = t1t2  所以next[3]=2 
082    
083 ***/ 
084 int Next(char son_str[],int next[])
085 {
086     int j = 0; 
087     int k = -1;
088     next[0] = -1;
089     int lenson = strlen(son_str);
090     while (j<lenson)
091     {
092           if (k==-1 || son_str[j] == son_str[k])
093           {
094               j++;
095               k++;
096               next[j] = k;
097           }
098           else
099           {
100               k = next[k];
101           }
102     }  
103 }
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:104398次
    • 积分:1215
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:89篇
    • 译文:0篇
    • 评论:1条
    最新评论