当前位置: 首页 > news >正文

实现strStr

KMP算法的主要思想:

当字符串出现不匹配时,可以知道之前匹配过的一部分内容,避免字符串从头开始匹配。(不理解的可以从b站上看奇乐编程学院)

明确KMP中每个字母及单词的含义:

next:模式串的前缀表。

s:代表文本串。

p:代表模式串。

i:代表文本的下标。

j:代表模式串的下标。

m:用于比较模式串和文本串是否相同。

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

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

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

方法一:暴力解法 。

class Solution {
public:int strStr(string s, string p) {int n = s.size(), m = p.size();for(int i = 0; i <= n - m; i++){int j = i, k = 0; while(k < m && s[j] == p[k]){j++;k++;}if(k == m) return i;}return -1;}
};

使用双层循环。定义两个int类型的变量m,n,分别用来记录文本串s和模式串p的长度。 当i大于零且小于文本串减模式串长度时,进入外层循环。定义一个变量j,将j初始化为i,定义一个变量k,将k初始化为0。的如果k小于m且以j为下标的文本串对应的值等于以k为下标对应的模式串的值时,进入内层循环。j加加,k加加。跳出内层循环。如果k==m。则返回i。跳出外层循环。返回-1。

方法二:KMP方法调用函数 。

class Solution {
public:void getNext(int* next, const string& m) {int j = 0;next[0] = 0;for(int i = 1; i < m.size(); i++) {while (j > 0 && m[i] != m[j]) {j = next[j - 1];}if (m[i] == m[j]) {j++;}next[i] = j; }}int strStr(string s, string p) {if (p.size() == 0) {return 0;  }int next[p.size()];getNext(next, p);int j = 0;for (int i = 0; i < s.size(); i++) {while(j > 0 && s[i] != p[j]) {j = next[j - 1];}if (s[i] == p[j]) {j++;}if (j == p.size()) {return (i - p.size() + 1);}}return -1;}
};

创建一个void类型的子函数命名为getNext。函数接收一个指向int类型数组的指针next,以及一个常量引用的字符串m。定义一个变量j表示模式串的下标初始化为0,初始化next数组的第一个元素为0。遍历模式串m,从第二个字符开始,计算每个位置对应的next。当j大于0且当年字符m[j]与m[i]不相等时,通过next数组回溯j的位置,目的是找到一个合适的j,使得从该位置开始能继续匹配。回溯j的位置,利用好已经计算好的next值,让j跳到合适的位置继续匹配。如果当前字母m[i]与m[j]相等,j加加。将当前位置i的最长前后缀记录到next数组中。创建一个int类型的主函数,用于在文本串s中定义查找p的首次出现的位置,接受文本串s和模式串p作为参数。如果模式串p的长度为0,则返回0。定义一个int类型的数组next,用于存储模式串p的前缀表。调用getNext计算模式串p的前缀表。定义一个变量j,并初始化为0。遍历文本串s,从第一个字符开始寻找模式串p。当j大于0且当前文本串s[i]不等于模式串p[j]。回溯j的位置,利用next数组调整j,以便继续匹配。如果当前文本串s[i]等于模式串p[j],j加加。如果j等于模式串p的长度说明找到了完整的模式串。返回模式串在文本串中首次出现的位置。跳出循环。返回-1。

方法三:KMP方法。 

class Solution {
public:int strStr(string s, string p) {if (p.size() == 0) {return 0;}int n = s.size();int m = p.size();int next[m];int j = 0;next[0] = 0;for (int i = 1; i < m; i++) {while (j > 0 && p[i] != p[j]) {j = next[j - 1];}if (p[i] == p[j]) {j++;}next[i] = j;}j = 0;for (int i = 0; i < n; i++) {while (j > 0 && s[i] != p[j]) {j = next[j - 1];}if (s[i] == p[j]) {j++;}if (j == m) {return (i - m + 1);}}return -1;}
};

相关文章:

  • python中,什么是协程?
  • 分享一款开源的图片去重软件 ImageContrastTools,基于Electron和hash算法
  • 蓝桥杯青少 图形化编程(Scratch)编程题每日一练——小猫的城堡
  • 机器学习-数据集划分和特征工程
  • Git clone时出现SSL certificate problem unable to get local issuer certificate
  • 2025-05-10-FFmepg库裁切有水印的视频
  • 系统思考:短期困境与长期收益
  • 嵌入式开发学习日志Day17
  • 设计模式-策略模式(Strategy Pattern)
  • VBA -- 学习Day4
  • 华为银河麒麟 V10(ARM)系统软件部署全攻略:Redis、RabbitMQ、MySQL 等集群搭建指南
  • Elasticsearch太重?它的超轻量的替代品找到了!
  • 华为OceanStor 5500 V3存储证书过期问题处理
  • lambda 表达式
  • 在一台CentOS服务器上开启多个MySQL服务
  • 【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发
  • 代码随想录第40天:图论1
  • 1、mongodb-- BSON 学习和JSON性能对比
  • qml用PathView实现Cover Flow效果
  • Lightweight App Alternatives
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 高盛上调A股未来12个月目标点位,沪深300指数潜在回报15%
  • A股低开高走全线上涨:军工股再度领涨,两市成交12934亿元
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 公元1057年:千年龙虎榜到底有多厉害?