找出字符串中第一个匹配项的下标

news2024/11/18 0:49:20

题目链接

找出字符串中第一个匹配项的下标

题目描述

注意点

  • haystack 和 needle 仅由小写英文字符组成

解答思路

  • 使用KMP算法,相比于普通地将整个字符串分成多块大小为needle.length()的子串找到第一个与needle匹配的子串,其可以在判断出任意一个子串不是匹配项时,无需从haystack下一位和needle第一位开始判断,而是根据needle中相同的前缀,直接排除一定不是匹配项的下标,转而从有可能匹配的位置开始判断,其时间复杂度相比于O(mn)缩短到了O(m + n)
  • KMP算法第一个关键点在于找到needle中相同的前缀,其思路为:建立两个指针i = 1,j = 0,遍历needle,如果i和j处的字符相同,则next[i] = j,且将i和j都向右移动一位;如果i和j处的字符不同,则将j移动至next[j - 1]处,直到i和j处的字符相同或j = 0为止,示例如abeabeabg对应的next数组为000123450
  • KMP算法第二个关键点在于根据next优化查询匹配项的步骤,其思路为:建立两个指针i = 0,k = 0,遍历haystack,如果i和k处的字符相同,则将i和k都向右移动一位;如果i和j处的字符不同,则将k移动至next[k - 1]处,直到i和k处的字符相同或k = 0为止,其保证排除掉一定不是匹配项的下标。示例如在abeabeabeabeabg找到abeabeabg,其会在i = 8,k = 8时判断出当前子串不匹配,随后将指针k移动至5,从指针i = 9,k = 6再一次开启匹配项的判断

代码

class Solution {
    public int strStr(String haystack, String needle) {
        // abeabeabeabeabg
        // abeabeabg
        // 000123450
        int m = haystack.length();
        int n = needle.length();
        if (n > m) {
            return -1;
        }
        // 找到needle中相同的前缀
        int[] next = new int[n];
        int j = 0;
        for (int i = 1; i < n; i++) {
            // needle[i] != needle[j],则j = next[j - 1],直到j = 0或needle[i] = needle[j]为止
            while(j > 0 && needle.charAt(i) != needle.charAt(j)) {
                j = next[j - 1];
            }
            // needle[i] = needle[j],next[i] = j + 1,i++,j++
            if (needle.charAt(i) == needle.charAt(j)) {
                j++;
                next[i] = j;
            } else {
                next[i] = 0;
            }
        }
        int k = 0;
        for (int i = 0; i < m; i++) {
            while (k > 0 && haystack.charAt(i) != needle.charAt(k)) {
                k = next[k - 1];
            }
            if (haystack.charAt(i) == needle.charAt(k)) {
                k++;
            }
            if (k == n) {
                return i - k + 1;
            }
        }
        return -1;
    }
}

关键点

  • KMP算法的思想
  • 注意边界问题

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

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

相关文章

“当当平台关键字搜索API:轻松实现高效购物,获取海量商品信息!“

当当平台关键字搜索API可以让开发者通过API接口在当当平台上进行关键字搜索&#xff0c;从而获得商品列表。以下是使用当当平台关键字搜索API的一般步骤&#xff1a; 在当当开放平台注册账号&#xff0c;创建应用&#xff0c;获取API使用的App Key。根据当当开放平台的文档&am…

Linux系统的特点以及年轻人如何获取第一个Linux系统

由新闻想到的 新闻一&#xff1a;政府机构 5000 万台电脑将替换为国产 Linux &#xff01; 由这个新闻想到的&#xff0c;如果中国的所有个人、企业、政府把电脑系统都换成linux或者是国产操作系统&#xff0c;那将是怎样的一种景象&#xff01;&#xff1f; 新闻二&#xf…

Spring Cloud 之 GateWay简介及简单DEMO的搭建

&#xff08;1&#xff09;Filter&#xff08;过滤器&#xff09;&#xff1a; 和Zuul的过滤器在概念上类似&#xff0c;可以使用它拦截和修改请求&#xff0c;并且对上游的响应&#xff0c;进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的…

竞赛选题 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 前言1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 该项目较为新颖&#xff0c;适合作为竞…

究竟如何?深入研究在缺少main.go文件时如何运行Go代码

是否可以在没有main.go文件的情况下运行Go代码&#xff1f; &#x1f600; 在Go语言中&#xff0c;包(package)是代码组织的基本单元&#xff0c;而可执行程序则需要一个特殊的main包和一个main函数。本篇博客将帮助您理解Go语言中包和可执行程序的概念&#xff0c;以及main.go…

【单片机毕业设计】【hj-006-7】CO、有害混合气体检测 | 空气质量检测 | 有害气体检测

一、基本介绍 项目名&#xff1a; 基于单片机的CO、有害混合气体检测系统设计 基于单片机的空气质量检测系统设计 基于单片机的有害气体检测系统设计 项目编号&#xff1a;mcuclub-hj-006-7 单片机类型&#xff1a;STC89C52 具体功能&#xff1a; 1、通过MQ-7检测CO值&#x…

hbase操作学习

1.namespace list_namespace 展示数据库 create_namespace 可以带属性名 属性值 create_namespace mydb,{author>hjp,ctime>2023-10-18}describe_namespace ‘库名’ 查看库的详细信息 alter_namespace ‘库名’ 修改表的详细信息 删除就是把method设置为unset dr…

STM32 __attribute__((section(“***“)))

1.在参考例程做STM32 IAP升级时遇到了关于__attribute__((section("***")))的问题&#xff0c;例程使用的是 uint8_t USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000))); 例程在使用CUBEIDE编译时提示warning: at attribute directive ignored [-Watt…

长钢管每米直线度检测 在线直线度测量仪轻松搞定!

钢管是一种常见的建筑材料&#xff0c;广泛应用于各种建筑和工程领域。钢管的直线度对于其使用性能和使用寿命具有重要影响&#xff0c;因此需要对钢管的直线度进行检测。传统的钢管直线度检测方法是通过测量多段钢管的直线度和弯头的角度来实现&#xff0c;这种方法不仅效率低…

Python常用语句(初学入门)不要一直做脚本小子

目录 一、判断语句 1、if语句 2、if-else语句 3、if-elif语句 4、if嵌套 二、循环语句 1、while循环 2、for循环 3、while嵌套 三、Python的其他语句 1、break语句 2、continue语句 3、pass语句 4、else语句 ~~~摆脱脚本小子&#xff0c;从现在开始学习Python~~~ …

将用友U8的数据可视化需要哪些工具?

将金蝶U8的数据可视化需要一个奥威BI数据可视化工具&#xff0c;以及一套专为用友U8打造的标准化BI数据分析方案。 奥威BI SaaS平台&#xff1a;一键链接用友U8&#xff0c;立得报表 别的BI软件围绕用友U8的数据做可视化&#xff1a;1、准备配置环境&#xff1b;2、下载安装配…

canvas绘制多种文字效果:描边,阴影,渐变色等

canvas可以绘制多种样式的文字效果&#xff1a;比如渐变&#xff0c;阴影&#xff0c;描边等效果&#xff0c;如下图&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta…

淘宝天猫商品详情接口(店铺所有商品接口,商品搜索列表接口)代码展示

业务背景&#xff1a;大家有探讨稳定采集淘宝天猫商品详情页面的数据包括App端和H5端及PC端&#xff0c;采集数据包括&#xff1a;获取商品列表主图、价格、标题&#xff0c;sku&#xff0c;商品评论日期&#xff0c;评论内容&#xff0c;评论图片&#xff0c;买家昵称&#xf…

动态天气预报:Living Weather HD for Mac

Living Weather HD能够为Mac用户提供及时、准确、个性化的天气信息&#xff0c;并提供了丰富的定制选项&#xff0c;使用户能够更加方便地查看天气状况。 具有以下特点&#xff1a; 显示世界各地的准确天气预报和当地时间。自动探测出用户所在的首个地点&#xff0c;并通过搜…

如何用滚动字幕丰富视频内容?只需5个步骤

视频制作需要各种元素来吸引观众的注意力&#xff0c;其中滚动字幕是一个非常实用的工具&#xff0c;可以提供背景信息&#xff0c;引导观众&#xff0c;或者作为一种装饰元素。以下是如何使用滚动字幕丰富视频内容的五个步骤&#xff1a; 1. 下载并安装适合的辅助工具 为了快速…

fault-localization-data下载配置

一、rjust-fault-localization-data下载配置 Ubuntu 22.04.03、运行环境为&#xff1a;jdk1.7 、ant1.8. 、maven 3.8. 所需文件下载地址JDK 7/1.7jdk-7u80-linux-x64.tar.gzFault-localization-dat地址 或者git clone https://bitbucket.org/rjust/fault-localization-data.…

C语言基于AVL树实现简单的文件数据库

目录 前言一、设计思路二、文件存储格式三、数据库操作3.1. 数据库结构3.2. 数据库初始化3.3. 插入3.4. 删除3.5. 修改3.6. 查询3.7. 清空 四、示例代码 前言 之前介绍了C语言实现AVL树&#xff0c; 本文是对AVL树的一个简单应用&#xff0c;在资源偏紧张的硬件设备中可以使用…

C++当中的IO流介绍 - operator 类型()的特殊用法

C语言当中的IO流 C语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意&#xff1a;宽度输出和精度输出控制。C语言借助…

数字图像处理实验记录二(直方图和直方图均衡化)

文章目录 一、基础知识1&#xff0c;什么是直方图2&#xff0c;直方图有什么用3&#xff0c;直方图均衡化4、原理代码实现 二、实验要求任务1&#xff1a;任务2&#xff1a; 三、实验记录任务1&#xff1a;任务2&#xff1a; 四、结果展示任务1&#xff1a;任务2&#xff1a; 五…

利用Cpolar永久免费内网穿透软件实现IStoreOS安装与远程访问

文章目录 前言1. ssh局域网登陆iStoreOS系统2. 安装Cpolar内 网穿透软件3. 测试公网远程链接4. 公网使用固定http地址远程访问iStoreOS webui界面 前言 iStoreOS系统是基于OpenWrt定制的软路由系统&#xff0c;提供了如轻nas&#xff0c;云盘&#xff0c;文件共享等众多网络服务…