kmp算法字符串匹配C语言实现
来源:互联网 发布:霹雳知乎 编辑:程序博客网 时间:2024/06/10 07:34
kmp算法字符串匹配
在leetcode做题时,有道题就是写一个strstr函数,先用思路最简单的直接两个循环做,提示时间超过限制。就查了查kmp的资料
翻了下算法导论,感觉像在看数学书,看不太懂,最后还是网上看的博客……
理解kmp的思路可以看这个http://kb.cnblogs.com/page/176818/
/************************************************************Copyright (C), 2015, Leon, All Rights Reserved.FileName: kmp_strstr.cDescription: kmp算法字符串匹配实现 Author: LeonVersion: 1.0Date: 2016年3月28日14:15:50Function:History:<author> <time> <version> <description> Leon************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>/*next数组下标表示字符串长度,因此初始化要多初始化一个位置*/void compute_next(char *s, int *next){ int i = 0, len = strlen(s); int k = 0; next[0] = next[1] = 0; for(i = 1; i < len; i++) { while(k > 0 && s[k] != s[i]) k = next[k]; if(s[k] == s[i]) k++; next[i+1] = k; }}char *kmp_strstr(char *s, char *t){ int s_len, t_len, i, j=0; int *next = NULL; if(!s || !t) return NULL; s_len = strlen(s); t_len = strlen(t); if(t_len == 0) return s; next = (int *)malloc(sizeof(int) * (t_len + 1)); if(!next) return NULL; compute_next(t, next); for(i = 0; i < s_len; i++) { while(j > 0 && s[i] != t[j]) j = next[j]; if(s[i] == t[j]) j++; if(j == t_len) { //printf("match %d\n", i-j+1); free(next); return s+i-j+1; } } free(next); return NULL;}int main(int argc, char *argv[]){ char *s; s = kmp_strstr(argv[1], argv[2]); printf("%s\n", s?s:"NULL"); printf("%s\n", strstr(argv[1], argv[2])?:"NULl"); return 0;}
即便理解了思路,写程序的时候还是在下标计算哪里卡了很久
leetcode跑了60来个测试用例,显示运行时间0ms,处在第一梯队,说明kmp算法即便在极端的情况下,效率依然不错。
0 0
- KMP字符串匹配算法C语言实现
- kmp算法字符串匹配C语言实现
- C语言实现字符串匹配KMP算法
- 字符串匹配算法(KMP算法c语言实现)
- 字符串匹配问题 kmp算法C语言实现
- KMP字符串匹配算法及C语言实现
- c语言:字符串匹配的KMP算法
- C语言KMP字符串匹配算法
- 模式匹配 KMP C语言算法实现
- C语言实现KMP模式匹配算法
- [算法]两种字符串匹配算法(索引法,KMP算法)对比,C语言实现
- KMP算法(字符串匹配算法)之PHP语言实现
- [C++]KMP算法匹配字符串
- C语言 算法"KMP" 查找字符串 ”模式匹配“
- kmp字符串匹配算法实现
- 字符串匹配KMP算法实现
- KMP字符串匹配算法实现
- 字符串匹配算法KMP实现
- HanLP里使用DAT存取字典的方法
- J2EE轻量级框架--3.28学习心得
- 光电传感器笔记
- AndroidStudio R.java文件丢失的问题
- 屏幕参数
- kmp算法字符串匹配C语言实现
- 单链表-----数据结构
- 求两个数的最大公约数
- Remove Node in Binary Search Tree
- 黑马程序员——JAVA学习日志之异常
- Leetcode 110. Balanced Binary Tree
- mysql创建用户和授权的三种方式
- tomcat、servlet学习
- 【spark source】Spark LinearRegression源码解读