#include <stdio.h>
#include <stdlib.h>
#include <string>
#include<string.h>
#define MAXSTRLEN 255 /* 可以在255以内定义最大串长 */
typedef char SString[MAXSTRLEN + ]; /* 0号单元存放串的长度 */
void get_next(SString T, int next[]);
void get_nextval(SString T, int nextval[]);
int Index(SString S, SString T, int pos) {
int i = pos; int j = ;
while (i <= S[] && j <= T[]) {
if (S[i] == T[j]) {++i; ++j;} //继续比较后继字符
else {i = i - j + ; j = ;} //指针后退重新开始匹配
}
if (j > T[]) return i - T[];
else return ;
} int Index_KMP_1(SString S, SString T, int pos) {
int i = pos; int j = ;
int *next = (int *)malloc((T[] + ) * sizeof(int));
get_next(T, next);
while (i <= S[] && j <= T[]) {
if (j == || S[i] == T[j]) {++i; ++j;} //继续比较后继字符
else j = next[j]; //模式串向右移动
}
free(next);
if (j > T[]) return i - T[]; //匹配成功
else return ;
} void get_next(SString T, int next[]) {
int i = , j = ; next[] = ;
while (i < T[]) {
if (j == || T[i] == T[j]) {++i; ++j; next[i] = j;}
else j = next[j];
}
} int Index_KMP_2(SString S, SString T, int pos) {
int i = pos; int j = ;
int *nextval = (int *)malloc((T[] + ) * sizeof(int));
get_nextval(T, nextval);
while (i <= S[] && j <= T[]) {
if (j == || S[i] == T[j]) {++i; ++j;} //继续比较后继字符
else j = nextval[j]; //模式串向右移动
}
free(nextval);
if (j > T[]) return i - T[]; //匹配成功
else return ;
} void get_nextval(SString T, int nextval[]) {
int i = ; nextval[] = ; int j = ;
while (i < T[]) {
if (j == || T[i] == T[j]) {
++i; ++j;
if (T[i] != T[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
}
/*
样例
s:ababcabcacbab
t:abcac */
int main(){
SString S, T;
scanf("%s",S+);
S[]=strlen(S+);
S[S[]+]='\0'; scanf("%s",T+);
T[]=strlen(T+);
T[T[]+]='\0';
printf("Index: %d\n", Index(S, T, ));//暴力模式匹配方法
printf("Index_KMP_1: %d\n", Index_KMP_1(S, T, ));//KMP算法
printf("Index_KMP_2: %d\n", Index_KMP_2(S, T, ));//KMP优化算法
}

模式串匹配,kmp的更多相关文章

  1. 模式串匹配KMP详解

    关于KMP模式串匹配网上蛮多的. 对于KMP有自己理解所以写下来希望能够对你们的学习有帮助. 之前暑假的时候学过,然后好长时间没用发现又忘了,现在再看看发现有了新的理解. ============== ...

  2. 模式串匹配之KMP算法

    模式串匹配之KMP算法 KMP算法 模式值计算(next[j]) (1) next[0]=-1,  第一个字符模式值为-1 (2) next[j]=-1, T中下标为j的字符与首字符相同,且j前面的1 ...

  3. 单模式串匹配----浅谈kmp算法

    模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...

  4. hdu 1686 Oulipo 【KMP】(计算模式串匹配的次数——与已匹配的字串可以有交集)

    题目链接:https://vjudge.net/contest/220679#problem/B 题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于100 ...

  5. AC自动机——多模式串匹配的算法思想

    标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算 ...

  6. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  7. 【转载】多模式串匹配之AC自动机

    原文地址:https://www.cnblogs.com/codeape/p/3845375.html 目录 [隐藏] 一.概述 二.AC算法思想 三.字典树tire的构造 四.搜索路径的确定 附录: ...

  8. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  9. HDU1686 计算模式串匹配的次数

    题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于1000000,w长度小于10000,计算W匹配到T中成功的次数: 这题很明显要用KMP算法,不然很容易 ...

  10. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

随机推荐

  1. C语言getopt()函数的使用

    getopt(分析命令行参数)     相关函数表头文件         #include<unistd.h>定义函数         int getopt(int argc,char * ...

  2. OC-内存管理-基本原理与引用计数器

    基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用 ...

  3. 开发Yii2过滤器并通过behaviors()行为调用

    在Yii2的几乎每个controller中,我们都会看到一个函数behaviors(),通常,我们用这个函数来配置控制器的权限,例如:public function behaviors()    {  ...

  4. 二叉排序树(Binary Sort Tree)

    参考文章:http://blog.csdn.net/ns_code/article/details/19823463 不过博主的使用第一种方法操作后的树已经不是二叉排序树了,值得深思!! #inclu ...

  5. 巧用array_map()和array_reduce()替代foreach循环

    1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $v ...

  6. Python开发【第四篇】:Python基础之函数

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式   result = 值1 if 条件 else 值2   # 如果条件成立,那么将 “值1” 赋值给 ...

  7. javascript 之Object内置对象

    Object.defineProperty(obj, prop, descriptor)

  8. LAMP环境CentOS6.4 PHP5.4随笔未整理

    首先安装一些辅助的软件或者说是依赖的关系包. 1.安装libxml2: libxml是一个用来解析XML文档的函数库.它用C语言写成, 并且能为多种语言所调用,例如C语言,C++,XSH.C#, Py ...

  9. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  10. ajax如何返回多个值

    应用场景:  在前端有个ajax请求到后端后,需要返回多个变量的值,在这里使用的是Json格式作为值传递,使用eval函数来解析Json格式. 要传递的值data: var data = " ...