LeetCode刷题---找出字符串中第一个匹配项的下标(Java实现KMP算法)

news2024/9/22 19:23:20

在这里插入图片描述

朴素算法

朴素算法是用来解决字符串匹配的问题的,现有主串aaaab和子串aab,如果使用朴素算法解决该问题,它首先会将主串的第一个字符和子串的第一个字符进行比较,如果主串和子串第一个字符相同,则比较第二个字符,依次往下比较,直到子串与主串有一个字符不同的时候,子串会从主串的第二个字符开始上述操作。
使用朴素算法它的时间复杂度为o(m*n).
代码实现

class Solution {
    public int strStr(String haystack, String needle) {
       
       for(int i=0;i<=haystack.length()-needle.length();i++)
       {
           int a=i;
           int b=0;
           while(b<needle.length() && haystack.charAt(a)==needle.charAt(b))
           {
               a++;
               b++;
           }

           //完全匹配,返回第一个下标
           if(b==needle.length())
           {
               return i;
           }
          
       }
       return -1;
    }
}

KMP算法

在这里插入图片描述

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

部分匹配值也叫最长公共前后缀,通俗来讲前缀就是包头不包尾,后缀就是包尾不包头。
在这里插入图片描述
(KMP模式匹配算法)与朴素匹配算法类似,只是在每次匹配过程中发生某次失配时,不再单纯地把模式后移一位,而是根据当前字符的特征数(next数组中当前字符的匹配值,也叫当前字符的最长相等前后缀场地)来决定模式右移的位数 。

KMP算法代码实现
class Solution {
    public int strStr(String haystack, String needle) {
       //获取两个字符串的长度
       int n=haystack.length();
       int m=needle.length();

        //构建子串的next匹配数组,在next数组中存储的是子串的每个字符的最长前缀后缀相等长度
        //next数组的长度为子串的长度
        int[] next=new int[m];
        next[0]=0;
        for(int i=1,j=0;i<m;i++)
        {
            //当匹配不到的情况下
            if(j>0 && needle.charAt(i)!=needle.charAt(j))
            {
                //回溯获取j的值
                j=next[j-1];
            }
            //当匹配到的情况下,j+1
            if(needle.charAt(i)==needle.charAt(j))
            {
                j++;
            }
            next[i]=j;
        }

        //实现kmp搜索算法完成搜索
        for (int i = 0, j = 0; i < n; i++) {
            //主串字符和子串字符不匹配
            while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {
                //回溯使用next数组中的匹配值
                //此处就是和朴素算法的根本区别
                j = next[j - 1];
            }
            if (haystack.charAt(i) == needle.charAt(j)) {
                j++;
            }
            //能匹配到子串返回的结果
            if (j == m) {
                return i - m + 1;
            }
        }
        //不能匹配到返回的结果
        return -1;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot鞋包商城-计算机毕设 附源码 28653

springboot鞋包商城 摘 要 鞋包商城采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户及卖家三部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、网站管理&#xff08;轮播图、网站公告&#xff09;、人员管理&#xff08;管理员、卖家、…

KT6368A蓝牙芯片的4脚也就是蓝牙天线脚对地短路了呢?是不是坏了

一、问题简介 KT6368A芯片的4脚&#xff0c;也就是蓝牙天线脚&#xff0c;万用表测量对地短路了呢&#xff1f;是不是芯片坏掉了&#xff0c;能不能重新寄样品给我。 详细说明 首先&#xff0c;芯片没有坏&#xff0c;遇到自己不懂的地方&#xff0c;不要轻易的去怀疑。 而是…

ZKP7.3 Linear-time encodable code based on expanders

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 7: Polynomial Commitments Based on Error-correcting Codes (Yupeng Zhang) 7.3 Linear-time encodable code based on expanders SNARKs with linear prover time Linear-time encodable code [Spielman’96][Druk-Ishai…

会议邀请 | 思腾合力邀您共赴第二十一届中国电博会与元宇宙产业论坛

由国务院台湾事务办公室、江苏省人民政府主办的「第二十一届中国&#xff08;苏州&#xff09;电子信息博览会」将于2023年11月9日-11日在苏州国际博览中心举办。思腾合力作为行业领先的人工智能基础架构解决方案商&#xff0c;受邀参加本次盛会。思腾合力市场总监徐莉受邀出席…

构造最小堆、最小堆排序

堆是一种特殊的完全二叉树 堆具有以下方法 关键点&#xff1a; 插入&#xff1a;在 store 末端插入新元素&#xff0c;然后把新元素上浮。弹出&#xff1a;将 store 顶端&#xff08;索引为0处&#xff09;弹出&#xff0c;作为最小元素&#xff1b;把末端元素放到索引0处&a…

动态表单生成Demo(Vue+elment)

摘要&#xff1a;本文将介绍如何使用vue和elment ui组件库实现一个简单的动态表单生成的Demo。主要涉及两个.vue文件的书写&#xff0c;一个是动态表单生成的组件文件&#xff0c;一个是使用该动态表单生成的组件。 1.动态表单生成组件 这里仅集成了输入框、选择框、日期框三种…

WebAssembly完全入门——了解wasm的前世今身

前言 接触WebAssembly之后&#xff0c;在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期&#xff0c;要么是文章中的例子自己去实操不能成功&#xff0c;要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度&…

Linux 环境下 安装 Elasticsearch 7.13.2

Linux 环境下 安装 Elasticsearch 7.13.2 前言镜像下载&#xff08;国内镜像地址&#xff09;解压安装包修改配置文件用 Es 自带Jdk 运行配置 Es 可被远程访问然后启动接着启动本地测试一下能不能连 Es 前言 借公司的 centos 7 服务器&#xff0c;搭建一个 Es&#xff0c;正好熟…

8.3 矢量图层点要素单一符号使用五

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染几何生成器&#xff08;Geometry generator&#xff09;QGis代码实现 总结 前言 上一篇教程介绍了矢量图层点要素单一符号中填充标记的用法本章继续介绍单一符号中各种标记的用法说明&#xff1a;文章中的示例…

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成&#xff0c;可以将其理解为智能手机的屏幕。 增强现实&#xff0c;从本质上说&#xff0c;是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

java项目之中学校园网站(ssm框架)

项目简介 中学校园网站实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、教师管理、学生管理、校园概况管理、名师风采管理、校园公告管理、试卷管理、试题管理、校园论坛、系统管理、考试管理。教师&#xff1a;个人中心、校园概况管理、名师风采管理、校园公告管理…

PM866 3BSE050200R1 L003748-AR 3BSX108237R300

PM866 3BSE050200R1 L003748-AR 3BSX108237R300 工业自动化制造商和工业物联网工具开发商Opto 22宣布推出新版groov&#xff0c;将IIoT technologies MQTT和OPC-UA驱动程序直接嵌入其工业边缘设备。新版本添加到用于web和移动可视化的groov View软件以及开源的Node-RED开发环境…

第三方支付预付卡业务详解

第三方支付预付卡业务详解 第三方支付预付卡业务是指由第三方支付公司提供的一种预先充值后消费的支付方式。用户可以在第三方支付平台上购买预付卡&#xff0c;然后在指定的商户或者服务提供商那里进行消费。 运作模式&#xff1a; 1. 用户在第三方支付平台购买预付卡&#xf…

Django项目单字段的区间查询

在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据&#xff0c;而且是对但字段查询这个时候我们有两两种方法解决 单字段类型是DateTimeField的 查询日期范围的 这个时候在filter.py里面重写DateTimeFromToRangeFilter&#xff0c;为什么要重写呢&am…

kubernetes部署(web界面)

基本队对象 pod 最小单位 service 跟网络相关 Volume Namespace 准备工作&#xff1a; master node1 node2 修改主机名&#xff1a; 做本地解析 10.0.0.51 master 10.0.0.56 node-1 10.0.0.186 node-2 关闭swap分区&#xff1a; swapoff -a  临时关闭 …

双点双向重发布解决方案

某公司有两张园区网络&#xff0c;分别是A园区和B园区&#xff0c;由于业务需求&#xff0c;需要将两张园区网络整合到一起&#xff0c;实现互联互通。 因此管理员将AR2-AR4、AR3-AR5通过物理线缆相连&#xff0c;并且此互联链路运行在ospf 100中。 现在要求工程师在AR2和AR3…

AD教程(三)IC类元件模型的创建

AD教程&#xff08;三&#xff09;IC类元件模型的创建 IC类元件 IC芯片&#xff08;Intergrated Circuit Chip&#xff09;是将大量的微电子元器件&#xff08;晶体管、电阻、电容等&#xff09;形成的集成电路放在一块塑基上&#xff0c;做成一块芯片。 IC类元件的创建 新…

JAVA发票管理的收货单订单创建发票详情介绍

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

用十万字讲明白linux和java的零复制技术

linux I/O 读写方式 Linux提供了轮询、I/O中断以及DMA传输这3种磁盘与主存之间的数据传输机制。 轮询方式是基于死循环对 I/O 端口进行不断检测。 I/O中断方式 I/O 中断方式是指当数据到达时&#xff0c;磁盘主动向 CPU 发起中断请求&#xff0c;由 CPU 自身负责数据的传输…

10.31一些代码分析,香浓展开,移位器(桶形多位),二进制转格雷码

always的block之间&#xff0c;采用并行执行 always之内&#xff0c;采用非阻塞赋值&#xff0c;为顺序执行 一些代码分析 这个把使能信号和W信号组合在一起&#xff0c;进行case语句&#xff0c;即只有合并信号最高位为1时&#xff0c;才进行操作 always后面要写&#xff0…