《数据结构》之串的模式匹配算法——KMP算法
//串的模式匹配算法
//KMP算法,时间复杂度为O(n+m)
#include <iostream>
#include <string>
#include <cstring>
using namespace std; //-----串的定长顺序存储结构-----
#define MAXLEN 255 //串的最大长度
typedef struct {
char ch[MAXLEN + ]; //存储串的一维数组
int length; //串的当前长度
}SString; int Next[MAXLEN + ];
int nextval[MAXLEN + ]; int Index_KMP1(SString S, SString T, int pos)
{//利用模式串T的Next函数求T在主串S中的第pos个字符之后的位置
//其中,T非空,1<=pos<=S.length
int i = pos, j = ;
while (i <= S.length && j <= T.length) //两个串均未比较到串尾
{
if (j == || S.ch[i] == T.ch[j]) { ++i; ++j; } //继续比较后继字符
else j = Next[j]; //模式串向右移动
}
if (j > T.length) return i - T.length; //匹配成功
else return ; //匹配失败
} int Index_KMP2(SString S, SString T, int pos)
{
int i = pos, j = ;
while (i <= S.length && j <= T.length)
{
if (j == || S.ch[i] == T.ch[j]) { ++i; ++j; }
else j = nextval[j];
}
if (j > T.length) return i - T.length;
else return ;
} void get_next(SString T, int Next[])
{//求模式串T的Next函数值并存入数组Next
int i = , j = ;
Next[] = ;
while (i < T.length)
{
if (j == || T.ch[i] == T.ch[j]) { ++i; ++j; Next[i] = j; }
else j = Next[j];
}
} void get_nextval(SString T, int nextval[])
{//求模式串T的Next函数修正值并存入数组nextval
int i = , j = ;
nextval[] = ;
while (i < T.length)
{
if (j == || T.ch[i] == T.ch[j])
{
++i; ++j;
if (T.ch[i] != T.ch[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
} int main()
{
SString A, B;
A.ch[] = B.ch[] = ' ';
while (scanf("%s%s", A.ch + , B.ch + ) == )
{
A.length = strlen(A.ch + );
B.length = strlen(B.ch + );
get_next(B, Next);
get_nextval(B, nextval);
//修正之后匹配更快,结果相同
int ans1 = Index_KMP1(A, B, ), ans2 = Index_KMP2(A, B, );
printf("%d\t%d\n", ans1, ans2);
}
return ;
}
《数据结构》之串的模式匹配算法——KMP算法的更多相关文章
- 串的模式匹配算法 ------ KMP算法
//KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
- 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
--喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...
- Java数据结构之字符串模式匹配算法---KMP算法2
直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...
- Java数据结构之字符串模式匹配算法---KMP算法
本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...
- 串的模式之kmp算法实践题
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 【算法】串的模式匹配算法(KMP)
串的模式匹配算法 问题: 求子串位置的定位函数如何写? int index(SString S,SString T,int pos); 给定串S,子串T,问T在 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
随机推荐
- TaggingJS – 可以灵活定制的 jQuery 标签系统插件
TaggingJS 是一款 jQuery 插件,用来创建高度可定制的前端标签系统.这款插件不到3KB ,支持主流浏览器.有几种方法来定制 TaggingJS 的默认行为:一是使用 custom_op ...
- BitcoinJS - 支持比特币交易的 JavaScript 库
BitcoinJS 是一个干净,可读的 JavaScript 开发库,用于比特币交易.支持 Node.js 平台和浏览器端.已有超过150万的钱包用户在使用, BitcoinJS 是几乎所有的 Web ...
- 20款时尚的 WordPress 企业模板【免费主题下载】
在这篇文章中,我们收集了20款时尚的 WordPress 企业模板.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许多第三方开发的免费模板,安装方式简单 ...
- CSS级联和继承
2016-11-06 <CSS入门经典>第七章 1.在HTML中使用CSS样式表的三种方式: (1)内联的样式表. eg:<em style="background-whi ...
- 【经验之谈】前端面试知识点总结(HTML相关)——附答案
目录 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5的优点与缺点? 3.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? 4.HTML5有哪些新 ...
- JavaScript学习笔记-实例详解-类(一)
实例详解-类(一): //每个javascript函数(除了bind())都自动拥有一个prototype对象// 在未添加属性或重写prototype对象之前,它只包含唯一一个不可枚举属性const ...
- CSS3动画(个人理解)
随着学习的深入,越来越觉得Css3动画的重要,虽然JQ自定义动画和动画回调函数必须掌握,但是css3动画做起来更加绚丽,更加方便!1.常规使用1.1 使用transition属性,一般我们是配合hov ...
- CSAW2013
竞赛地址:https://ctf.isis.poly.edu/challenges/ 第一关:Trivia Trivia意思为琐事,每题分值50,比较简单 1.Drink all the booze, ...
- [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注解支持
以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3709957.html 之前写过一篇博客,是使用Fragment来实现T ...
- 《The Linux Command Line》 读书笔记01 基本命令介绍
<The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...