//串的模式匹配算法
//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算法的更多相关文章

  1. 串的模式匹配算法 ------ KMP算法

    //KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...

  2. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

  3. 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    --喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...

  4. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  5. Java数据结构之字符串模式匹配算法---KMP算法

    本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...

  6. 串的模式之kmp算法实践题

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  7. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  8. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

  9. 串、串的模式匹配算法(子串查找)BF算法、KMP算法

    串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...

随机推荐

  1. 带给您灵感的25个最新鲜的 HTML5 网站

    感谢 HTML5 带来的惊人的先进特性,在未来几年,HTML5 将会继续发挥巨大的推动作用,不仅是在 Web 应用中,网页设计领域也会有新的变革.今天,我们在这里集合了能够带给您灵感的25个最新鲜的 ...

  2. Arcgis Engine 切割图斑(ITool)

    public override void OnMouseDown(int Button, int Shift, int X, int Y) { // TODO: Add Cut.OnMouseDown ...

  3. SharePoint 2013 初始化Ribbon选中Tab

    SharePoint使用中,经常打开页面会有默认展开的Ribbon选项,有时这又不是我们需要的,所以我们就需要默认选中的项目,下面简单介绍下如何实现. 方法一 1.Dispform.aspx页面默认R ...

  4. 关于web软件信息安全问题防护资料的整理(二)

    想要做好软件的安全防护,首先就得了解web系统的安全威胁,那么web系统都存在哪些威胁呢? 应用层攻击.网络层攻击和混合攻击. 传统被动.单点以及彼此孤立的防护手段已不能应对越来越严峻的安全威胁. 改 ...

  5. ECMAScript对文件夹图片幻灯片播放

    代码如下: var curContext = null; var curWeb = null; var picListTitle = "PictureLib"; var folde ...

  6. 根据字符串生成类---类的类型.self---根据字符串创建控制器对象

    swift和OC一样,都是通过NSClassFromString,根据一个字符串,生成相应的类. // UITabBarButton是系统的私有类,不能直接使用 // if btn.isKind(of ...

  7. PHP学习之登录以及后台商品展示

    1.3用户登录 用户登录成功后跳转到商品显示页面 1.3.1设计界面 1.新建一个login.php页面,用来做用户的登录 2.登录业务原理 通过输入的用户名和密码查询对应的记录,表示登陆成功,否则登 ...

  8. Android 网络图片查看器

    今天来实现一下android下的一款简单的网络图片查看器 界面如下: 代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  9. Android 使用xml序列化器生成xml文件

    在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列 ...

  10. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...