字符串匹配—KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 。
实现方式就不再这里献丑了,网上很多讲解,此处只是记录下c#实现的代码。

public class KMP
{
    public static int[] GetNext(String ps)
    {
        char[] p = ps.ToArray();
        int[] next = new int[p.Length];
        next[0] = -1;
        int j = 0;
        int k = -1;
        while (j < p.Length - 1)
        {
            if (k == -1 || p[j] == p[k])
            {
                next[++j] = ++k;
            }
            else
            {
                k = next[k];
            }
        }
        return next;
    }

    public static int GetIndex(String ts, String ps)
    {
        char[] t = ts.ToArray();
        char[] p = ps.ToArray();
        int i = 0; // 主串的位置
        int j = 0; // 模式串的位置
        int[] next = GetNext(ps);
        while (i < t.Length && j < p.Length)
        {
            if (j == -1 || t[i] == p[j])
            {
                // 当j为-1时,要移动的是i,当然j也要归0
                i++;
                j++;
            }
            else
            {
                // i不需要回溯了
                // i = i - j + 1;
                j = next[j]; // j回到指定位置
            }
        }

        if (j == p.Length)
        {
            return i - j;
        }
        else
        {
            return -1;
        }
    }
}

//test
static void Main(string[] args)
{
    Console.WriteLine( KMP.GetIndex("abcdbcxdbc", "dbc"));
    Console.ReadKey();
}

字符串匹配—KMP算法

Original: https://www.cnblogs.com/xtt321/p/14022697.html
Author: 温暖如太阳
Title: 字符串匹配—KMP算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593291/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • gulp: Did you forget to signal async completion? 解决方案

    学习gulp的前端自动化构建,按照示例代码,跑了一个简单的task,控制台打出如下提示: The following tasks did not complete: testGul…

    Java 2023年6月15日
    062
  • Spring常用注解(SpirngBoot方面讲的更加详细)

    使用注解须知: 基本方向 1. bean @Component 2. 属性如何注入 @Component public class User{ public String name…

    Java 2023年6月14日
    083
  • 外卖项目

    项目介绍: 本项目,瑞吉外卖是专门为餐饮企业,餐厅,饭店定制的一款软件产品,包括系统管理,后台和移动端应用两部分,其中系统管理后台主要提供给餐饮企业内部员工使用,可以对餐厅的菜品,…

    Java 2023年6月6日
    084
  • 接口偶尔超时,竟又是JVM停顿的锅!

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介 继上次我们JVM停顿十几秒的问题解决后,我们系统终于稳定了,再也不会无故重启了!这是之前的文章…

    Java 2023年6月7日
    074
  • MyBatis架构与源码分析<资料收集>

    1、架构与源码分析 :https://www.cnblogs.com/luoxn28/p/6417892.html 、https://www.cnblogs.com/wangdai…

    Java 2023年5月30日
    066
  • [游戏引擎中文版]Hot Soup Processor最新中文支持版

    最近有的论坛希望能自己开发GAL 而不是一味 汉化GAL 就想找程序猿帮忙。 借此机会 我推出游戏引擎中文支持版,希望大家能开发属于自己的GALGAME! 上次就为大家介绍一个引擎…

    Java 2023年5月29日
    087
  • 记一次Idea无法打开记录(idea升级)

    记一次Idea无法打开记录 前言,本来今天是打算升级Idea,然后体验一波的,结果升级完之后,发现无法打开idea(双击之后并没有任何打开的反应)。 原因排查,打开idea所在目录…

    Java 2023年6月5日
    060
  • JDK JRE JVM

    JDK JDK:Java Development Kit,Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac,jav…

    Java 2023年6月9日
    054
  • springboot自动配置原理以及手动实现配置类

    springboot自动配置原理以及手动实现配置类 1、原理 spring有一个思想是”约定大于配置”。 配置类自动配置可以帮助开发人员更加专注于业务逻辑开…

    Java 2023年6月15日
    078
  • 三天学会使用MyBatis框架,绝对干货,只实战,不学究!

    2022最新版Mybatis框架教程来咯!开肝! 快速开启你的 MyBatis之旅! 通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是…

    Java 2023年6月9日
    050
  • 单机高并发模型设计

    背景 在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐…

    Java 2023年6月8日
    094
  • 619

    entity: package com.meta.hrpz.domain.entity; import com.alibaba.fastjson.JSON; import lomb…

    Java 2023年6月5日
    067
  • 从零开始实现放置游戏(十六)——道具系统(1)道具字典

    道具系统是游戏的核心系统之一,常见的业务功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依赖道…

    Java 2023年6月5日
    070
  • Linux系统中Redis和Tomcat的PID文件路径设置

    Tomcat: /bin/catalina.sh 文件头注释下面添加一行:CATALINA_PID=/var/run/tomcat.pid Redis: redis.conf配置文…

    Java 2023年6月5日
    0102
  • 蜻蜓点水说说Redis的String的奥秘

    本篇博客参考:掘金Redis小册 敖丙 如果面试官问你,单线程的Redis为什么那么快,你可能脱口而出,因为单线程,避免上下文切换;因为基于内存,比硬盘读写快很多;因为采用的是多路…

    Java 2023年6月5日
    078
  • rabbitmq web管理

    celery突然连接不上rabbitmq server,结果找半天发现是rabbitmq卡的不行。。。 rabbitmq 设置web管理,添加用户 rabbitmqctl list…

    Java 2023年5月30日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球