今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现。

代码如下:

 1 char *strstr(const char*s1,const char*s2)
 2 {
 3     const char*p=s1;
 4     const size_t len=strlen(s2);
 5     for(;(p=strchr(p,*s2))!=0;p++)
 6     {
 7         if(strncmp(p,s2,len)==0)
 8             return (char*)p;
 9     }
10     return(0);
11 }

从上面的GCC中strstr实现代码可以分析出,strstr的时间复杂度是O(n2)的(因为strncmp是O(N)的),不过对长字符串匹配子串上可以采用kmp算法来提高效率(时间复杂度为O(m+n)),这里翻出了自己以前写的kmp算法的接口放到这里和大家分享一下,之前我也写过一篇关于kmp匹配子串的一篇文章,也可以去看一下。

这是我之前写的关于kmp介绍的文章地址:http://www.cnblogs.com/daimadebanyungong/p/4756853.html

下面是我翻出来的很早之前写的一个C版本的kmp算法的实现接口,欢迎纠正错误和分享经验。

  1 #include <string.h>
  2 #include <stdio.h>
  3
  4 #define LIB_MATCH_NUM  5
  5 #define LIB_STRING_LEN 40
  6
  7 char lib_match[LIB_MATCH_NUM][LIB_STRING_LEN] =
  8 {
  9     "www.baidu.comw",
 10     "www.google.com",
 11     "www",
 12     "baidu.com",
 13     "lualu",
 14 };
 15
 16 int lib_match_len[LIB_MATCH_NUM];
 17
 18 int lib_match_next[LIB_MATCH_NUM][LIB_STRING_LEN + 1] = {0};
 19
 20
 21 void get_next();
 22
 23 void lib_match_init()
 24 {
 25     memset(lib_match_len,0,sizeof(lib_match_len));
 26     int i;
 27     for(i = 0; i < LIB_MATCH_NUM; i++)
 28     {
 29         lib_match_len[i] = strlen(lib_match[i]);
 30     }
 31
 32     get_next(); // init next array
 33 }
 34
 35 void get_next()
 36 {
 37     int i,j,k;
 38
 39     for(i = 0; i < LIB_MATCH_NUM; i++)
 40     {
 41
 42         lib_match_next[i][0] = 0;
 43         lib_match_next[i][1] = 0;
 44
 45         k = 0; //point to the last next[j]
 46         int len = lib_match_len[i];
 47
 48         for( j = 1; j < len; j++)
 49         {//j start from 1 because next start from 2
 50             k = lib_match_next[i][j]; //k = next[j];
 51
 52             while(k > 0 && lib_match[i][j] != lib_match[i][k])
 53             {
 54                 k = lib_match_next[i][k];
 55             }
 56
 57             if(lib_match[i][j] == lib_match[i][k])
 58             {//s[j] == s[next[k]] next[i+1] = next[k] +1
 59                 k++;
 60             }
 61
 62             lib_match_next[i][j+1] = k;
 63         }
 64
 65     }
 66
 67 }
 68
 69 int lib_search(char *orignal,int len)
 70 {
 71     if(orignal == NULL)
 72     {
 73         return 0;
 74     }
 75
 76     int i,j,k;
 77
 78     for(i = 0; i < LIB_MATCH_NUM; i++)
 79     {
 80         char *tmp = orignal; // match each model need to start from the first
 81         k = 0; // k start from the last next array
 82
 83         for(j = 0; j < len; j++)
 84         {
 85
 86             while( k > 0 && tmp[j] != lib_match[i][k])
 87             {
 88                 k = lib_match_next[i][k];
 89             }
 90
 91             if(tmp[j] == lib_match[i][k])
 92             {
 93                 k++;
 94             }
 95
 96             if(k == lib_match_len[i])
 97             {
 98                 printf("match the model string %d : %s\n", i,lib_match[i]);
 99                 printf("match at the position  :%d\n\n", j - lib_match_len[i] + 1);
100
101                 // here can return the i to know which model string have been matched
102
103                 k = lib_match_next[i][k]; //to match another this model string
104             }
105
106         }
107
108     }
109
110     return 0;
111 }
112
113 void print_next()
114 {
115     int i,j;
116
117     for(i = 0; i < LIB_MATCH_NUM; i++)
118     {
119         printf("model string : %s \n",lib_match[i]);
120         printf("next array:");
121         for(j = 0; j < lib_match_len[i]+1;j++)
122         {
123             printf(" %d",lib_match_next[i][j]);
124         }
125         printf("\n\n");
126     }
127 }
128
129
130 int main()
131 {
132     char orignal[40];
133
134     lib_match_init();
135
136     print_next();
137
138     while(1)
139     {
140
141         scanf("%s",orignal);
142
143         if(strcmp(orignal,"0") == 0)
144         {
145             return 0;
146         }
147
148         lib_search(orignal,strlen(orignal));
149     }
150
151     return 0;
152
153 }

转载于:https://www.cnblogs.com/daimadebanyungong/p/5258631.html

Linux GCC下strstr的实现以及一个简单的Kmp算法的接口相关推荐

  1. 在Linux环境下运行你的第一个C语言程序

    在Linux环境下运行你的第一个C语言程序 1.前言 2.环境配置 1.1 安装编辑器 1.2 安装gcc编译器 3.编写第一个C程序 3.1 新建文件夹 3.2 编辑该文件 3.3 编译mian.c ...

  2. 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。

    在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...

  3. linux下安装两个nginx教程,在linux系统下安装两个nginx的简单方法

    在linux系统下安装两个nginx的简单方法 发布时间:2017-03-09 12:08 来源:互联网 当前栏目:web技术类 在linux下安装nginx的时候,一般在./configure的阶段 ...

  4. lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法

    什么是LRU算法? redis大家都玩过吧,你们好奇redis内存数据存满之后会发生什么吗?抛出异常?禁止使用?还是删除数据?其实redis设计了一种内润淘汰机制. noeviction(默认策略): ...

  5. 用C语言或C++编写一个简单的银行家算法模拟程序

    1.问题描述 银行家算法是操作系统中避免死锁的典型算法.用C语言或C++编写一个简单的银行家算法模拟程序,实现多个进程争用系统临界资源时的分配过程.要求程序实现: 1.当一进程请求一组资源时,先确定是 ...

  6. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动

    目录 0.测试环境说明 1.设备树的修改 2.设备驱动框架 3.I2C数据传输过程 3.1 struct i2c_msg 3.2 SHT20的数据收发 4.I2C适配器超时等待时间的修改 本文资源 参 ...

  7. linux logo程序设计,教你在线设计一个简单美观的LOGO

    当你配置好Linux服务器并上传网站程序到服务器上,直到架设网站成功,你可能需要一个美观的LOGO,如果你对LOGO的要求不高,可以在线自己设计一个,因为网站发展初期,你没有什么资金,请不了专业的美化 ...

  8. leetcode 028.实现strStr(),即查找重复字符串(KMP算法)

    前言 本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配.Knuth-Morris-Pratt 算法.Boyer-Moore 算法.Sunday 算法等 ...

  9. 【Linux】关于三角函数、反三角函数在VC和linux gcc下的编译

    写法: 1.都要包含 <math.h> 2.三角函数,比如计算sin(30),应写 double  a; a = sin(30 * 3.1415926 /180): 3.反三角函数,比如a ...

最新文章

  1. 京东AI战略宏图展现 不枉挖来这么多AI大牛
  2. myeclipse安装svn插件的多种方式
  3. python 读图片性能测试
  4. 数据对象类代码的生成小工具
  5. 【NLP】新闻上的文本分类:机器学习大乱斗
  6. Python 之 使用 PIL 库做图像处理
  7. @requestbody 接受int参数_C++之指针作为函数参数
  8. live555 windows下编译以及修订
  9. [前缀和][dp] Jzoj P5873 小p的属性
  10. android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...
  11. 腾讯,开源了,高性能 RPC 框架,是要干DUBBO 吗?
  12. Atitit 编程语言的分类 v2 目录 1.1. 基于代数划分 第一代。。。第三代。。4gl。。5gl自然语言 1 1.2. 按照编程范式分类 . 命令式语言 .函数式语言...逻辑式语言
  13. Julia: 关于Github上的其它库
  14. 渗透测试-主动信息收集(3)
  15. SAP License:ERP实施方案包括哪些内容?
  16. 路由器设置虚拟服务器utorrent,路由器用户PT站“可连接:否”最简解决办法
  17. 被遗忘的艺术——图思维方式
  18. android背光控制 自动关闭,Android P自动背光原理
  19. 阿里云物联网平台场景体验-阿里云开发者社区
  20. VIA图像标注系统汉化版

热门文章

  1. 杨臻《PPT,要你好看》(第二版)XMind思维导图
  2. matlab如何进行数字信号处理,使用MATLAB进行数字信号处理-第2部分
  3. 一篇五分生信临床模型预测文章代码复现——Figure1 差异表达基因及预后基因筛选——下载数据(一)
  4. 月旦评 之 DevOps招贤令2018
  5. Censor KMP算法
  6. 计算机网络macaw,分组交换
  7. eyoucms采集发布,让你轻松发布大量内容!
  8. html5在线编辑器 h,前端最好用的HTML在线编辑器是哪一款
  9. excel数据以千位单位K显示
  10. 内存取证CTF-Memlabs靶场2