int next[N];
char str1[M],str2[N];
//str1 长,str2 短
//len1,len2,对应str1,str2的长 void get_next(int len2)
{
int i = ,j = -;
next[] = -;
while(i<len2)
{
if(j == - || str2[i] == str2[j])
{
i++;
j++;
if(str2[i] != str2[j])
next[i] = j;
else
next[i] = next[j];
}
else
j = next[j];
}
//计算某字符串的周期,如aaaa是4,abcd是1
/*
int i = 0;j = -1;
next[0] = -1;
while(str2[i])
{
if(j == -1 || str2[i] == str2[j])
{
i++;j++;
next[i] = j;
}
else
j = next[j];
}
len = strlen(str);
i = len-j;
if(len%i==0)
return len/i;
else
return 1;
*/
} int kmp(int len1,int len2)
{
int i = ,j = ;
get_next(len2);
while(i<len1)
{
if(j == - || str1[i] == str2[j])
{
i++;
j++
}
else
j = next[j];
/*
if(j == len2)//计算str2在str1中出现多少次
{
cnt++;
j= next[j];
}
*/
}
//return j; //j为匹配的长度
if(j>len2)
return ;//这里也可以返回i-len2来获得匹配在主串中开始的位置
else
return ;
} //数字KMP
int a[],b[];
int next[],n,m; void getnext()
{
int i = ,j = -;
next[] = -;
while(i<m)
{
if(j == - || b[i] == b[j])
{
i++;
j++;
if(b[i] == b[j])
next[i] = next[j];
else
next[i] = j;
}
else
j = next[j];
}
} int kmp()//返回匹配位置
{
int i = ,j = ;
while(i<n)
{
if(a[i] == b[j])
{
if(j == m-)
return i-j+;
i++;
j++;
}
else
{
j = next[j];
if(j == -)
{
i++;
j = ;
}
}
}
return -;
}

NO6——KMP的更多相关文章

  1. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  2. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  3. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  4. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  5. [KMP]【学习笔记】

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Descript ...

  6. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

  7. KMP专题

    1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...

  8. KMP学习之旅

    说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...

  9. KMP模板

    参考:http://www.cnblogs.com/c-cloud/p/3224788.html #include<stdio.h> #include<string.h> vo ...

随机推荐

  1. ProjectServer任务审批后自动发布

    我们知道ProjectServer汇报工时的顺序是这样: 1.项目成员打开自己的时间表,选择要汇报的任务,在汇报工时栏填写实际工时. 2.汇报工时后点击保存. 3.将汇报工时的任务提交给项目经理. 4 ...

  2. 课时59.体验css(理解)

    我们想做这样一个样式,应该怎么做? 分析: 有一个标题(h1),还有一些段落(p) 标题是居中的,段落也是居中的,所以我们可以设置h标签和p标签居的align属性等于center来实现 标题和段落都有 ...

  3. 开发工具--Eclipse使用及常见问题解决

    怎么查询Eclipse版本号: 方法一: 方法二: Eclipse安装目录下面找到readme文件夹,里边有个网页打开就可以看到当前版本; Eclipse汉化改为英文: Eclipse Mybatis ...

  4. 2018/7/19 考试(tower,work,holes)

    noip模拟赛,挺良心的题,考的贼烂(膜一下@来日方长大佬(sdfz rank1)) 不多说了,看题吧 1.tower 题面: 铁塔(tower.pas/c/cpp) 题目描述 Rainbow和Fre ...

  5. JDBC编程:使用 Statement 修改数据库

    获取数据连接后,即可对数据库中的数据进行修改和查看.使用 Statement 接口可以对数据库中的数据进行修改,下面是程序演示. /** * 获取数据库连接,并使用SQL语句,向数据库中插入记录 */ ...

  6. chromium之ThreadLocalStorage

    看看头文件怎么用 // Wrapper for thread local storage. This class doesn't do much except provide // an API fo ...

  7. 通过命令在navicat中创建数据库及表结构

    方法/步骤     首先我们双击打开[navicat]这款软件,在菜单栏中选择[文件]-->[新建连接]-->[MySQL]: 步骤阅读   在打开的[新建连接]对话框中输入[连接名]和[ ...

  8. 汇编:采用址表的方法编写程序实现C程序的switch功能

    //待实现的C程序 1 void main() { ; -) { : printf("excellence"); break; : printf("good") ...

  9. Angular : 基础语句说明, 响应式表单指令, 组件生命周期钩子

  10. Leecode刷题之旅-C语言/python-21.合并两个有序链表

    /* * @lc app=leetcode.cn id=21 lang=c * * [21] 合并两个有序链表 * * https://leetcode-cn.com/problems/merge-t ...