【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II

作者推荐

【矩阵快速幂】封装类及测试用例及样例

本文涉及的基础知识点

二分查找算法合集

LeetCode100207. 找出数组中的美丽下标 II

给你一个下标从 0 开始的字符串 s 、字符串 a 、字符串 b 和一个整数 k 。
如果下标 i 满足以下条件,则认为它是一个 美丽下标 :
0 <= i <= s.length - a.length
s[i…(i + a.length - 1)] == a
存在下标 j 使得:
0 <= j <= s.length - b.length
s[j…(j + b.length - 1)] == b
|j - i| <= k
以数组形式按 从小到大排序 返回美丽下标。
示例 1:
输入:s = “isawsquirrelnearmysquirrelhouseohmy”, a = “my”, b = “squirrel”, k = 15
输出:[16,33]
解释:存在 2 个美丽下标:[16,33]。

  • 下标 16 是美丽下标,因为 s[16…17] == “my” ,且存在下标 4 ,满足 s[4…11] == “squirrel” 且 |16 - 4| <= 15 。
  • 下标 33 是美丽下标,因为 s[33…34] == “my” ,且存在下标 18 ,满足 s[18…25] == “squirrel” 且 |33 - 18| <= 15 。
    因此返回 [16,33] 作为结果。
    示例 2:
    输入:s = “abcd”, a = “a”, b = “a”, k = 4
    输出:[0]
    解释:存在 1 个美丽下标:[0]。
  • 下标 0 是美丽下标,因为 s[0…0] == “a” ,且存在下标 0 ,满足 s[0…0] == “a” 且 |0 - 0| <= 4 。
    因此返回 [0] 作为结果。
    提示:
    1 <= k <= s.length <= 5 * 105
    1 <= a.length, b.length <= 5 * 105
    s、a、和 b 只包含小写英文字母。

KMP

KMP类的 vector m_vSameLen;//m_vSame[i]记录 s[i…]和t[0…]最长公共前缀,增加可调试性
枚举(s,a)的下标看m_vSameLen[i] 是否等于a.length。
(s,b)类似。将符合条件的下标放到bindex中,由于是升序,所以可以用二分查找。看是否存在[i-k,i+k]的下标。

代码

封装类

class KMP
{
public:virtual int Find(const string& s, const string& t){CalLen(t);m_vSameLen.assign(s.length(), 0);for (int i1 = 0, j = 0; i1 < s.length(); ){for (; (j < t.length()) && (i1 + j < s.length()) && (s[i1 + j] == t[j]); j++);//i2 = i1 + j 此时s[i1,i2)和t[0,j)相等 s[i2]和t[j]不存在或相等m_vSameLen[i1] = j;//t[0,j)的结尾索引是j-1,所以最长公共前缀为m_vLen[j-1],简写为y 则t[0,y)等于t[j-y,j)等于s[i2-y,i2)if (0 == j){i1++;continue;}const int i2 = i1 + j;j = m_vLen[j - 1];i1 = i2 - j;//i2不变}for (int i = 0; i < m_vSameLen.size(); i++){//多余代码是为了增加可测试性if (t.length() == m_vSameLen[i]){return i;}}return -1;}vector<int> m_vSameLen;//m_vSame[i]记录 s[i...]和t[0...]最长公共前缀,增加可调试性
protected:void CalLen(const string& str){m_vLen.resize(str.length());for (int i = 1; i < str.length(); i++){int next = m_vLen[i - 1];while (str[next] != str[i]){if (0 == next){break;}next = m_vLen[0];}m_vLen[i] = next + (str[next] == str[i]);}}int m_c;vector<int> m_vLen;//m_vLen[i] 表示t[0,i]的最长公共前后缀	
};

核心代码

class Solution {
public:vector<int> beautifulIndices(string s, string a, string b, int k) {KMP kmpa, kmpb;kmpa.Find(s, a);kmpb.Find(s, b);vector<int> bindex;for (int i = 0; i < kmpb.m_vSameLen.size(); i++){if (kmpb.m_vSameLen[i] == b.length()){bindex.emplace_back(i);}}vector<int> vRet;for (int i = 0; i < kmpa.m_vSameLen.size(); i++){if (kmpa.m_vSameLen[i] == a.length()){auto it1 = std::lower_bound(bindex.begin(), bindex.end(), i - k);auto it2 = std::upper_bound(bindex.begin(), bindex.end(), i + k);if (it2 - it1 > 0){vRet.emplace_back(i);}}}return vRet;}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}int main()
{string a,b,s;int k;{Solution sln;s = "isawsquirrelnearmysquirrelhouseohmy", a = "my", b = "squirrel", k = 15;auto res = sln.beautifulIndices(s, a, b, k);Assert(vector<int>{16, 33}, res);}{Solution sln;s = "abcd", a = "a", b = "a", k = 4;auto res = sln.beautifulIndices(s, a, b, k);Assert(vector<int>{0}, res);}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

usb个人总结

一、usb工具分析 1、不同的usb抓包工具抓包分析 2、USB抓包分析方式 外接usb分析仪分析 &#xff08;1&#xff09;力科usb分析仪 &#xff08;2&#xff09;HD-USB12 协议分析仪 &#xff08;3&#xff09;沁恒CH552 usb分析仪&#xff0c;软件工具USB2.0 Monitor (4)等等…

RICHARD MILLE 理查米尔顶级制表技艺典范之作:RM 35-03腕表

瑞士高端制表品牌RICHARD MILLE(理查米尔)在腕表界拥有着卓越的地位,其材质、技术、设计、品质以及服务独树一帜,皆被认为是顶级水平的代表,经典作品数不胜数。而即使在众多经典之作中,RM 35-03 Rafael Nadal 自动上链腕表仍以独特蝶形摆陀和强大性能备受用户推崇,被誉为“RICH…

2024三掌柜赠书活动第三期:Rust系统编程

目录 前言 Rust语言概念 关于《Rust系统编程》 Rust系统编程的核心点 Rust系统编程的关键技术和工具 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《Rust系统编程》全书速览 结束语 前言 在技术圈&#xff0c;最近的编程语言新秀当属Rust莫属&#xff0c;R…

游戏开发农场游戏休闲娱乐游戏教育益智游戏开发

在当今快速发展的数字时代&#xff0c;游戏开发已经成为一个多元化且创新的领域。游戏不再仅仅是娱乐的手段&#xff0c;它们已经渗透到教育、社交、商业以及日常生活的各个方面。从农场养成游戏到元宇宙的探索&#xff0c;从休闲娱乐到虚拟现实&#xff08;VR&#xff09;和增…

java常见面试题:如何使用Java进行多线程编程和并发控制?

在Java中&#xff0c;多线程编程和并发控制是常见的编程任务。以下是一些基本概念和步骤&#xff0c;帮助你开始使用Java进行多线程编程和并发控制。 了解线程&#xff1a; 在Java中&#xff0c;线程是执行任务的单元。一个Java应用程序至少有一个线程&#xff0c;即主线程&am…

2024 解决matplotlib中文字体问题

第一种代码&#xff08;失败代码&#xff09; import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.font_manager import FontPropertiesfont_path /Users/huangbaixi/Desktop/SimHei.ttfdef plot_demo():#print(mpl.get_cachedir())# 绘制折线图font…

操作系统导论-课后作业-ch5

关于man的使用 man 系统参考手册 man n name 在系统手册第n章查看name1. 代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h>int main() {int x 100;int rc fork();if (rc -1) {fprintf…

16位单片机单片机S1C17153

16位单片机单片机 .16KB ROM / 2KB内存 * S1C17653对于程序开发很有用。 .产生具有内置振荡器的操作时钟。 - OSC3B振荡器电路&#xff1a;2MHz/1MHz/500kHz&#xff08;类型&#xff09;内部振荡器电路 -OSC1无振荡器电路&#xff1a;32.768 kHz&#xff08;类型&#xf…

SSL证书与HTTPS的关系

SSL证书是一种数字证书&#xff0c;由权威的证书颁发机构颁发。它包含了一个公钥和有关证书所有者的一些信息&#xff0c;如名称、组织、邮箱等。SSL证书的主要作用是实现数据加密和身份验证&#xff0c;确保数据在传输过程中的安全性和完整性。 HTTPS是一种基于HTTP协议的安全…

R语言【技巧】——判断自定义函数的传参内容是否符合要求

1. 利用 if 条件判断&#xff0c;stop 语句报错 比如 对一个应该传入数值型&#xff0c;数值为 0 或 1 的参数&#xff1a; if(add.strat<0 | add.strat>1){stop("add.strat represents the fraction of pseudoabsences that aresampled environmentally stratifi…

༺༽༾ཊ—游戏-01_2D-开发—ཏ༿༼༻

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…

Django教程第4章 | Web开发实战-三种验证码实现

系列&#xff1a;Django学习教程 验证码的存在是为了防止系统被暴力破解攻击&#xff0c;几乎每个系统都有验证码。下面将介绍三种生成验证码方式。 您可以根据你自己的需要进行学习。 手动生成验证码 安装绘图依赖&#xff0c;利用的是画图模块 PIL 以及随机模块 random 在后…

鸿蒙开发-UI-布局-线性布局

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 鸿蒙开发-UI-渲染控制 鸿蒙开发-UI-布局 文章目录 前言 一、基本概念 二、布局子元素 1.子元…

LoadMap9:C++的Template模板函数

1. 模板函数与模板类 模板Template和函数重载是实现静态多态的两种重要途径。对于模板而言&#xff0c;其通常用于模板函数和模板类中。其基本语法结构为&#xff1a; template <typename XXXX> // XXXX 代表定义的模板数据类型的名称1.1 模板函数 使用 template 关键…

User-Agent(用户代理)是什么?

User-Agent&#xff08;用户代理&#xff09;是什么&#xff1f; User-Agent 即用户代理&#xff0c;简称“UA”&#xff0c;它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客…

Android 13 关闭相册的编辑功能

介绍 因为做的是学生机&#xff0c;客户不希望相册的图片可以编辑。 分析 通过字符串我们找到了几个资源文件&#xff0c;以下只展示其中一个 路径&#xff1a;vendor/mediatek/proprietary/packages/apps/Gallery2/res/menu/operation.xml <item android:id"id/acti…

python3.7conda安装opencv

1.conda创建虚拟环境 conda create --name opencv3.7 python3.72.激活虚拟环境 conda activate opencv3.7 3.安装 opencv pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ opencv-python3.4.2.16 python3.7安装opencv python 和 opencv-contrib-python的相关问题…

Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

第十九章-ClassLoaderData初始化 讲解本章先从一张图开始 众所周知&#xff0c;Java类的相关信息都是存储在元空间中的&#xff0c;但是是怎么存储的&#xff0c;相信很多读者是不清楚的&#xff0c;这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData&…

MIT 6s081 lab 5: xv6 lazy page allocation

Page faults Basic 通过page fault可以实现一系列的虚拟内存功能&#xff1a; lazy allocationcopy-on-write forkdemand pagingmemory mapped files 虚拟内存的两个主要的优点&#xff1a; 1、隔离性&#xff1a;每个应用程序拥有自己的地址空间&#xff0c;因此不可能修…

【Dart】=> [06] Dart初体验-类Class-构造函数-继承-mixin-异步编程-链式调用-泛型-异常

目录 能够定义并使用Dart的类类的定义构造函数私有属性和方法继承mixin异步编程FutureFuture链式调用async - awaitdynamic类型泛型异常 能够定义并使用Dart的类 Dart是一门面向对象的编程语言&#xff0c;所有的对象都是类的实例 通过类我们可以对数据和方法进行封装复用 学习…