《数据结构》之串的模式匹配算法——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 ...
随机推荐
- WPF如何实现一个漂亮的页签导航UI
最近看到一个比较漂亮的UI主界面,该UI是用左边的页签进行导航,比较有特色,就想着尝试用WPF来实现一下.经过一番尝试,基本上将UI设计图的效果用WPF程序进行了实现.下面介绍一下主要的思路: 1 U ...
- Quill – 可以灵活自定义的开源的富文本编辑器
Quill 的建立是为了解决现有的所见即所得(WYSIWYG)的编辑器本身就是所见即所得(指不能再扩张)的问题.如果编辑器不正是你想要的方式,这是很难或不可能对其进行自定义以满足您的需求. Quill ...
- Onsen UI – 新鲜出炉的 PhoneGap 界面框架
Onsen UI 是一个基于元素自定义的 HTML5 UI 框架,用于构建你的移动前端.这个一个基于 Web 组件的概念的框架,让构建应用程序变得更加轻松.Onsen UI 专门针对 PhoneGap ...
- slid.es – 创建在线幻灯片和演示文稿的最佳途径
slid.es 提供了一种创建在线幻灯片和演示文稿的简单方法,让你通过几个简单的步骤制作效果精美的在线演示文稿.基于 HTML5 和 CSS3 实现,在现代浏览器中效果最佳. 您可能感兴趣的相关文章 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- Learn RxJava
Learn RxJava http://reactivex.io/documentation/operators.html https://github.com/ReactiveX/RxJava/wi ...
- yii redies 不同的工程缓存key的问题
参考这篇文章 基本配置操作: yii main.php中: return array( ... 'components'=>array( 'redis_cache' => array ( ...
- UITableViewController和延时执行、自定义控件
1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...
- android deep link(深度链接)与自定义协议!
此自定义仅供参考! 首先打开androidManifest.xml 在MainActivity中添加如下内容: <activity android:name=".MainActivit ...
- iOS 远程推送通知
1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...