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

news/2024/12/17 20:05:24/文章来源:https://www.cnblogs.com/shaneyale/p/18613336

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

  • 12.17.2024

问题描述:给你两个字符串haystackneedle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1 。

1. 示例1:- 输入:haystack = "sadbutsad", needle = "sad"- 输出:0- 解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0 。
2. 示例2:- 输入:haystack = "leetcode", needle = "leeto"- 输出:-1- 解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 10000
  • haystackneedle仅由小写英文字母组成

解法一:暴力(Brute Force)

最最容易的办法就是使用暴力的思想,时间复杂度为O(mn),思想十分简单,依次遍历比对即可,没什么好说的,比较简单,C++代码如下。

class Solution {
public:int strStr(string haystack, string needle) {for(int i = 0; i < haystack.size(); i++){bool match = true;for(int j = 0; j < needle.size(); j++){if(haystack[i + j] != needle[j]){match = false;break;}}if(match){return i;}}return -1;}
};

解法二:KMP算法

KMP算法的简要介绍

KMP算法是由Donald Knuth、Vaughan Pratt和James H.Morris独立发明的,并于1977年首次发表。KMP主要的特点是它避免了当模式串(即我们要查找的子串)和文本串(即被搜索的字符串)不匹配时对文本串的回溯,从而提高了效率。

KMP算法的核心思想

KMP算法通过先对模式串进行处理,构建一个前缀表,这个表格用于指示当模式串和文本串不匹配时,应该从模式串的哪个位置继续,而不是简单的把整个模式串从头开始重新进行比较,大大提高了效率。

NEXT数组(前缀表)的求解办法

  • 什么是前缀表?

  • 答:前缀表是记录下标i之前(包括i)的字符串中,相同的前后缀长度的大小。

  • 为啥要用前缀表?

  • 答:匹配失败的位置是在后缀子串的后面,那么我们找到和其相同的前缀后面重新匹配就可以了。

  • 如何计算前缀表?

  • 答:

    1. 首先初始化next[0]为0
    2. 然后从模式串的第二个字符开始,看当前字符是否匹配前一个字符
    3. 如果匹配,则前缀长度length加一,令next[i]length,然后继续匹配下一个;如果不匹配,则更新length为之前的next值,或者如果前缀长度为0,直接令当前的next为0,然后移动到下一个字符比较即可

KMP的主函数

  1. 先使用辅助函数计算出next数组
  2. 遍历文本串
  • 如果匹配,则文本串和模式串的指针都加一,继续
  • 如果不匹配,则看模式串的指针j是否为0,如果是0,则直接让文本串的i加一即可,如果不是,则直接调用next数组,从给定位置开始即可。

代码部分

// 计算部分匹配表(next数组)
void computeLPSArray(const std::string& pattern, std::vector<int>& lps) {int length = 0; // 前缀长度,初始化为0int i = 1; // 从模式字符串的第二个字符开始lps[0] = 0; // lps[0] 总是 0,因为单个字符没有前缀// 计算 lps[i] for i = 1 to M-1while (i < pattern.size()) {if (pattern[i] == pattern[length]) { // 如果当前字符匹配前缀字符length++; // 前缀长度增加lps[i] = length; // 记录 lps 值i++; // 移动到下一个字符} else { // 如果当前字符不匹配前缀字符if (length != 0) { // 如果前缀长度不为0length = lps[length - 1]; // 更新前缀长度为之前的 lps 值} else { // 如果前缀长度为0lps[i] = 0; // lps 值为0i++; // 移动到下一个字符}}}
}
// KMP算法搜索主函数
void KMPSearch(const std::string& text, const std::string& pattern) {int M = pattern.size();int N = text.size();// 创建 lps 数组,保存部分匹配表std::vector<int> lps(M);// 计算部分匹配表computeLPSArray(pattern, lps);int i = 0; // text 的索引int j = 0; // pattern 的索引while (i < N) {if (pattern[j] == text[i]) {i++;j++;}
cijif (j == M) {std::cout << "找到匹配位置: " << i - j << std::endl;j = lps[j - 1];} else if (i < N && pattern[j] != text[i]) {if (j != 0) {j = lps[j - 1];} else {i++;}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DL00336-基于多种机器学习模型的新能源电池寿命预测完整代码含数据集

随着新能源技术的迅速发展,电池作为核心组件在电动汽车、储能系统等领域的应用日益广泛,电池寿命预测成为关键技术之一。传统的电池寿命预测方法依赖于物理模型和经验公式,但这些方法无法有效应对电池老化过程中的复杂性与非线性特征。机器学习,尤其是基于多种模型的集成方…

OOP实验六

实验任务一:#pragma once#include <iostream> #include <stdexcept>// 声明 //////////////////////////////////////////////////// // 复数模板类声明 template<typename T> class Complex { public:Complex(T r = 0, T i = 0);Complex(const Complex<…

MeteoInfo-Java解析与绘图教程(十)_JAVA绘制雷达PPI图

天气雷达的基本要素有很多,特别是双偏振雷达更多,但业务场景经常使用的一般为基本反射率,基本速度这两种要素 接下来我们以基本反射率为例,其他的要素也是一样的,一通百通 首先我们做基本反射率的图需要确定做哪一个仰角层,因为雷达体扫模式的扫描是不同仰角进行扫描的,常规的雷…

友情链接

风筝上的猫IT分享--肯定放我自己了访问博客风筝上的猫IT分享--肯定放我自己了访问博客

画8.0

因为期末周忙着做汇报和复习 (其实是因为自己比较懒) ,所以这幅画完成的相当迟了。 头发画起来真实相当费劲啊。

都在使用的《模版模式》

模版符合开闭原则,到处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中到处使用。Channel中定义了需要的操作,AbstractChannel实现了核心功能,然后不同的Channel实现只需要告知具体channel的描述信息即可。 Channel 接口⬇︎⬇︎⬇︎点击查看代码 …

ifconfig命令

ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 在 实体机上 ifconfig 命令用于 显示或配置网络设备(网络接口卡) 或修改。(以CentOS…

数据智能,融合创新|12月中国数据库行业分析报告已发布, 持续为产业助力

本期报告以数据智能与融合创新为主题,除详解国产数据库市场动向外,探究了在云计算的推动下数据库自治、智能运维能力的产品创新实践,欢迎免费下载。为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析…

maven仓库

https://mvnrepository.com/

【教程】第八章:知识库——学海无涯

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。8.1 欢迎来到新的一章 在本章中,我们将深入学习如何构建一个知识库。这将是一个综合性的模块,帮助我们管理和组织文档、任务和信息。通过设计和创建一个树形结构的文档表,我们将实现对文…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错:YASQL-00021 input line overflow (>4000 byte at line 4)原因 yasql在交互模式模式下单行字符总量限制4000字节,超出该限制即报错。 交互式模式下,yasql会显示一个提示符,通常是 SQL>,等待用户输入命令, 用户执行的每个命令都会立即…

Fiddler连接mumu模拟器抓包

主要介绍mumu模拟器如何设置 一、模拟器下载fiddler证书 保持本机 fiddler 运行状态 模拟器打开 localhost:8888(端口号),点击下载证书二、安装证书信任 路径:模拟器-网络和互联网-互联网-网络偏好设置 安装证书,选择下载好的 fiddler 证书即可三、开启手动代理 修改网络设…