LeetCode-28-找出字符串中第一个匹配项的下标
创始人
2024-02-29 03:59:23
0

在这里插入图片描述

1、KMP算法$$

解决本问题最简单的方法就是暴力穷举,思路简单但时间复杂度为O(m∗n)O(m*n)O(m∗n)。此处我们仅考虑最优的KMP算法,时间复杂度为O(m+n)O(m+n)O(m+n)。

KMP算法的优化之处在于当我们对比haystackhaystackhaystack和needleneedleneedle时,当出现某一位上的字符不对应时,暴力穷举的方法是将needleneedleneedle重新从第0位开始进行匹配,而KMP算法则是跳到之前遍历的一个位置上继续进行遍历。

值得注意的是,为了确定当haystackhaystackhaystack和needleneedleneedle不匹配时我们需要跳到哪一位上,我们使用数组nextnextnext来进行记录当needleneedleneedle中第jjj位不匹配时需要跳转的位置next[j]next[j]next[j]。很显然,当j=0j=0j=0时,我们不用进行匹配,故next[0]=−1next[0] = -1next[0]=−1。而后:1、当k==−1∣∣p[j]==p[k]k == -1 || p[j] == p[k]k==−1∣∣p[j]==p[k]时,说明此时前面存在和我们开始部分相同的字符串,我们可以直接使用;2、当p[j]!=p[k]p[j] != p[k]p[j]!=p[k]时,说明此时我们不能直接使用,我们只能查询上一个对应的位置。

class Solution {
public:vector getNext(string p) {vector next(p.length());next[0] = -1;int j = 0;int k = -1;while (j < (int) p.length() - 1) {if (k == -1 || p[j] == p[k]) {j++;k++;next[j] = k;} else {k = next[k];}}return next;}int strStr(string haystack, string needle) {int i = 0;int j = 0;vector next = getNext(needle);while (i < (int) haystack.size() && j < (int) needle.size()) {if (j == -1 || haystack[i] == needle[j]) {i++;j++;} else {j = next[j];}}if (j == (int) needle.length()) {return i - j;}return -1;}
};

相关内容

热门资讯

行政公益诉讼典型案例:确立“诉... 行政公益诉讼典型案例确立“诉后履职不免除违法”裁判规则。 12月22日,最高人民法院、最高人民检察院...
拟写入法律!涉网络游戏等用语用... 十四届全国人大常委会第十九次会议12月22日继续审议国家通用语言文字法修订草案。草案二审稿明确,网络...
法援故事 | 农民工兄弟讨薪无... 编者按:法律援助是国家建立的为经济困难公民无偿提供法律服务的制度。近年来绵阳市两级法律援助中心始终秉...
两高典型案例:行政公益诉讼督促... 法检机关以行政公益诉讼促进妇女平等就业权益保障。 12月22日,最高人民法院、最高人民检察院联合发布...
最高法:行政公益诉讼的案件领域... 12月22日,最高人民法院举行新闻发布会,发布第三批行政公益诉讼典型案例。 本次发布的典型案例,涵盖...
新华社消息|托育服务法草案等一... 记者:董博婷、范思翔、赵博 编导:沈倩 新华社国内部 新华社音视频部 联合制作
国家医保局:“十五五”时期长期... 在2025全国长期护理保险高质量发展大会上,国家医保局党组书记、局长章轲在致辞时表示,经过试点,长期...
森远股份:将通过完善经营管理制... 有投资者在互动平台向森远股份提问:“公司好不容易扭亏为盈 但是已经很久没有分红了 考虑进行分红吗今年...
十年来全国检察机关共办理公益诉... 新华社北京12月22日电(记者冯家顺)2015年7月至2025年9月,全国检察机关共办理公益诉讼案件...
广告语被指“大字吹牛” 公牛集... 近期,插线板行业龙头公牛集团因常年沿用的一句“10户中国家庭,7户用公牛”广告语与中山市家的电器有限...