• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 经典的字符串模式匹配算法KMP算法

经典的字符串模式匹配算法KMP算法

作者:qq_26460507的博客 字体:[增加 减小] 来源:互联网 时间:2017-08-27

qq_26460507的博客通过本文主要向大家介绍了kmp字符串匹配算法,字符串kmp算法,字符串kmp,kmp字符串匹配,kmp算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
/* P为模式串,下标从0开始 */
void GetNext(string P, int next[])  ///优化前next计算结果
{
    int p_len = P.size();
    int i = 0;   //P的下标
    int j = -1;
    next[0] = -1;

    while (i < p_len)
    {
        if (j == -1 || P[i] == P[j])
        {
            i++;
            j++;
            next[i] = j;
            printf("j1=%d\n",j);
        }
        else{
            j = next[j];
            printf("j2=%d\n",j);
        }

    }
    for(i=0;i<p_len;i++){
        printf("%d ",next[i]);
    }
    printf("\n");
}
void GetNextval(string P, int nextval[])  ///优化后的next()结果
{
    int p_len = P.size();
    int i = 0;   //P的下标
    int j = -1;
    nextval[0] = -1;

    while (i < p_len)
    {
        if (j == -1 || P[i] == P[j])
        {
            i++;
            j++;
            if (P[i] != P[j])
                nextval[i] = j;
            else
                nextval[i] = nextval[j];  //既然相同就继续往前找真前缀
        }
        else
            j = nextval[j];
    }
}
/* 在S中找到P第一次出现的位置 */
int KMP(string S, string P, int next[])
{
    //GetNext(P, next);
    GetNextval(P,next);

    int i = 0;  //S的下标
    int j = 0;  //P的下标
    int s_len = S.size();
    int p_len = P.size();

    while (i < s_len && j < p_len)
    {
        if (j == -1 || S[i] == P[j])  //P的第一个字符不匹配或S[i] == P[j]
        {
            i++;
            j++;
        }
        else
            j = next[j];  //当前字符匹配失败,进行跳转
    }

    if (j == p_len)  //匹配成功
        return i - j;

    return -1;
}

int main()
{
    int next[100] = { 0 };

    cout << KMP("bbc abcdab abcdabcdabde", "abcdabd", next) << endl; //15

    //GetNext("abcdabd", next);

    return 0;
}

reference:https://www.61mon.com/index.php/archives/183/

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 经典的字符串模式匹配算法KMP算法
  • 字符串的模式匹配详解--BF算法与KMP算法
  • C语言实现字符串匹配KMP算法
  • 快速模式匹配算法(KMP)的深入理解

相关文章

  • 2017-05-28C++中Socket网络编程实例详解
  • 2017-05-28C++实现多线程查找文件实例
  • 2017-05-28解析C++中四种强制类型转换的区别详解
  • 2017-05-28C语言的冒泡排序和快速排序算法使用实例
  • 2017-05-28基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探讨
  • 2017-05-28实现一个内存池管理的类方法
  • 2017-05-28C语言中进制知识汇总
  • 2017-05-28浅析Linux下精确控制时间的函数
  • 2017-05-28C语言system 自动关机函数代码
  • 2017-05-28C++采用TLS线程局部存储的用法实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中输出十六进制形式的字符串
    • 详解C++中变量的初始化规则
    • C语言文件操作 fopen, fclose, mkdir详解
    • C/C++实现字符串模糊匹配
    • C语言实现斗地主的核心算法
    • 常用C/C++预处理指令详解
    • 基于C语言string函数的详解
    • C++非递归建立二叉树实例
    • C语言实现统计字符串单词数
    • 用while判断输入的数字是否回文数的简单实现

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有