【算法学习】KMP查找匹配字符串
2016-04-19 19:39
375 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> int GenNext(char *mod, int len, int next[]) { if (mod == NULL || next == NULL || len <= 0) return -1; next[0] = -1; int k = -1; int j = 0; while (j < len - 1) { if (k == -1 || mod[k] == mod[j]) { k++; j++; next[j] = next[k] + 1; } else { k = next[k]; } } return 1; } int KmpSearch(char *text, char *mod) { if (text == NULL || mod == NULL) return -1; int modlen = strlen(mod); int *next = (int *)malloc(sizeof(int) * modlen); if (!next) { return -1; } if (GenNext(mod, modlen, next) < 0) return -1; int i = 0, j = 0; int textlen = strlen(text); while (i < textlen && j < modlen) { if (text[i] == mod[j]) { i++; j++; } else { j = next[j]; } } free(next); if (j == modlen) return i - j; else return -1; } int main(int argc, char *argv[]) { char text[256], mod[16]; printf("Please input text:"); scanf("%s", text); printf("Please input mod:"); scanf("%s", mod); int index = KmpSearch(text, mod); printf("Index[%d] OK\n", index); return 0; }
主要思路是先用一个next数组保存模式字符串的最长前缀后缀字符串,在匹配时就可以根据next数组快速匹配,时间复杂度O(n+m), 空间复杂度O(m).
具体详见http://blog.csdn.net/v_july_v/article/details/7041827
相关文章推荐
- matlab tensor toolbox 实现HOSVD(高阶奇异值分解)推荐系统
- 在进程间切换文件描述符
- FZU 1911 Construct a Matrix
- 信息化给予我的感受
- 冲刺第一天
- 在WebApi中基于Owin OAuth使用授权发放Token
- POJ 2288 Islands and Bridges
- 数据结构和算法15 之二叉树排序
- LeetCode Sum Root to Leaf Numbers
- struts2的工作原理和相关文件的介绍
- 软件项目管理(二)——用jenkins持续集成、Maven、Github的使用
- androidstudio 问题
- hihoCoder--1268--九宫(全排列)
- js设置form的onsubmit事件
- 第八周项目4游戏中的角色类增强版
- 保姆照顾小孩的五种实现:常规、代理协议、Block、观察者、通知
- 多个C3P0的java举例
- HDFS副本放置策略
- 设计模式(6)之建造者模式
- 华为二面---华丽的扑街