【教3妹学编程-算法题】3008. 找出数组中的美丽下标 II

烦死了
3妹:呜呜,烦死了, 脸上长了一个痘
2哥 : 不要在意这些细节嘛,不用管它,过两天自然不就好了。
3妹:切,你不懂,影响这两天的心情哇。
2哥 : 我看你是不急着找工作了啊, 工作那么辛苦,哪还有时间想这些啊。
3妹:说到找工作,我又要去刷题了。
2哥:我给你出一道关于美丽的题吧,让你的心情美丽美丽~

题目:

给你一个下标从 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 * 10^5
1 <= a.length, b.length <= 5 * 10^5
s、a、和 b 只包含小写英文字母。

思路:

思考

KMP+二分查找,
用 KMP 求出 a 在 s 中的所有出现位置,记作 posA。
用 KMP 求出 b 在 s 中的所有出现位置,记作 posB。
遍历 posA中的下标 i,在 posB中二分查找离 iii 最近的 j。如果 ∣i−j∣≤k,则把 i 加入答案。

java代码:

class Solution {public List<Integer> beautifulIndices(String s, String a, String b, int k) {char[] text = s.toCharArray();List<Integer> posA = kmp(text, a.toCharArray());List<Integer> posB = kmp(text, b.toCharArray());List<Integer> ans = new ArrayList<>();for (int i : posA) {int bi = lowerBound(posB, i);if (bi < posB.size() && posB.get(bi) - i <= k ||bi > 0 && i - posB.get(bi - 1) <= k) {ans.add(i);}}return ans;}private List<Integer> kmp(char[] text, char[] pattern) {int m = pattern.length;int[] pi = new int[m];int c = 0;for (int i = 1; i < m; i++) {char v = pattern[i];while (c > 0 && pattern[c] != v) {c = pi[c - 1];}if (pattern[c] == v) {c++;}pi[i] = c;}List<Integer> res = new ArrayList<>();c = 0;for (int i = 0; i < text.length; i++) {char v = text[i];while (c > 0 && pattern[c] != v) {c = pi[c - 1];}if (pattern[c] == v) {c++;}if (c == m) {res.add(i - m + 1);c = pi[c - 1];}}return res;}// 开区间写法// 请看 https://www.bilibili.com/video/BV1AP41137w7/private int lowerBound(List<Integer> nums, int target) {int left = -1, right = nums.size(); // 开区间 (left, right)while (left + 1 < right) { // 区间不为空// 循环不变量:// nums[left] < target// nums[right] >= targetint mid = (left + right) >>> 1;if (nums.get(mid) < target) {left = mid; // 范围缩小到 (mid, right)} else {right = mid; // 范围缩小到 (left, mid)}}return right;}
}

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

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

相关文章

爬虫-8-数据存储-mysql

#mysql占空间最小吧&#xff0c;数据存储没问题吧 (//∇//)

【.net core】yisha框架,bootstrap-table组件增加固定列功能

需要引入 bootstrap-table-fixed-columns.css和bootstrap-table-fixed-columns.js文件 文件代码&#xff1a; bootstrap-table-fixed-columns.css样式文件代码 .fixed-table-header-columns, .fixed-table-body-columns {position: absolute;background-color: #fff;displa…

C++系统笔记教程----vscode远程连接ssh

C系统笔记教程 文章目录 C系统笔记教程前言开发环境配置总结 前言 开发环境配置 Ubuntu20.24VScode 如果没有linux系统&#xff0c;但是想用其编译&#xff0c;可以使用ssh远程连接。 首先进入vscode,打开远程连接窗口&#xff08;蓝色的小箭头这&#xff09; 选择连接到主机…

FFmpeg之AVFormat

文章目录 一、概述二、解封装流程三、重要结构体3.1、AVFormatContext3.2、AVInputFormat3.3、AVOutputFormat3.4、AVStream 四、重要函数分析4.1、avformat_alloc_context4.2、avformat_open_input4.2.1、init_input4.2.2、av_probe_input_format2 4.3、avformat_find_stream_…

Linux环境搭建FastDFS文件服务器(附带Nginx安装)

本文主要介绍在linux服务器如何搭建FastDFS文件服务器。大概分为9个步骤&#xff0c;由于内容较为繁琐。下面带你入坑&#xff01; 首先简单介绍一下FastDFS是淘宝资深架构师余庆老师主导开源的一个分布式文件系统&#xff0c;用C语言编写。适应与中小企业&#xff0c;对文件不…

设计 Pastebin.com

设计 Pastebin.com 设计 Bit.ly 是一个类似的问题&#xff0c;区别是 pastebin 需要存储的是 paste 的内容&#xff0c;而不是原始的未短化的 url. 怎么处理这个问题&#xff1f; 第一步&#xff1a;概述用例和约束 收集这个问题的需求和范畴。问相关问题来明确用例和约束&…

Github 2024-01-16 Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10HTML项目1 精心策划的Python资源列表 创建周期&#xff1a;3490 天开发语言&#xff1a;Python…

蓝桥杯备赛 | 洛谷做题打卡day3

蓝桥杯备赛 | 洛谷做题打卡day3 sort函数真的很厉害&#xff01; 文章目录 蓝桥杯备赛 | 洛谷做题打卡day3sort函数真的很厉害&#xff01;【深基9.例1】选举学生会题目描述输入格式输出格式样例 #1样例输入 #1 样例输出 #1 我的一些话 【深基9.例1】选举学生会 题目描述 学校…

23111 网络编程 day2

思维导图 重打代码 #include<myhead.h> #define SER_IP "192.168.122.150" //服务器ip #define SER_PORT 8888 //服务器端口int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("…

Python - 深夜数据结构与算法之 位运算

目录 一.引言 二.位运算简介 1.二进制与十进制 2.左/右移 3.位运算 4.异或 XOR 5.指定位置的位运算 6.实战要点 三.经典算法实战 1.Number-1-of-bits [191] 2.Power-Of-Two [231] 3.Reverse-2-Bits [190] 4.N-Queens [51] 四.总结 一.引言 通常情况下我们计数采…

Flink-SQL——时态表(Temporal Table)

时态表(Temporal Table) 文章目录 时态表(Temporal Table)数据库时态表的实现逻辑时态表的实现原理时态表的查询实现时态表的意义 Flink中的时态表设计初衷产品价格的例子——时态表汇率的例子——普通表 声明版本表声明版本视图声明普通表 一个完整的例子测试数据代码实现测试…

使用Github + PicGo搭建个人图床,并使用CDN加速

文章目录 前言创建仓库配置PicGo如何使用 前言 在写博客的时候&#xff0c;常常需要为博客配图&#xff0c;于是一个好用稳定的图床的重要性不言而喻。本文主要介绍如何使用GitHub PicGo的方式快速搭建一个个人使用的图床。该方式方便快捷&#xff0c;还免费hh&#xff0c;唯…

python 集合的详细用法

当前版本&#xff1a; Python 3.8.4 简介 Python中的集合是一种无序、可哈希的且不重复的数据类型&#xff0c;用于存储唯一的元素。集合的实现基于哈希表&#xff0c;因此在插入、查找和删除元素时具有高效性能。集合的每个元素都必须是不可变的&#xff0c;可以是数字、字符…

瑞_Java开发手册_(二)异常日志

文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附&#xff1a;错误码列表 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的异常日志篇&#xff0c;本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手…

基于Redis+Lua的分布式限流

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 前面我们了解了如何利用Nginx做网关层限流&#xf…

Microsoft Remote Desktop for Mac 中文正式版下载 微软远程连接软件

Microsoft Remote Desktop 是一款专为 Mac 用户设计的远程桌面工具&#xff0c;它可以帮助用户通过网络连接到其他计算机&#xff0c;实现远程控制和操作。 软件下载&#xff1a;Microsoft Remote Desktop for Mac 中文正式版下载 该工具支持多种远程连接协议&#xff0c;包括 …

【数学建模美赛M奖速成系列】数据可视化方法(一)

数据可视化方法 写在前面山脊图优点缺点实现matlabpython 气泡矩阵图实现matlabpython 后续 写在前面 最近开始更新一个新的系列科研绘图&#xff0c;在同一个竞赛下&#xff0c;大家都近乎相同的解题思路下。之所以能出现一等二等三等奖的区别很大部分都在于结果的可视化&…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一&#xff1a;创建自定义网络 首先&#xff0c;我们需要创建一个自定义网络&#xff0c;以便容器可以连接到这个网络上&#xff0c;从而实现互相通信。在命令行中执行以下命令&#xff1a; # 创建 docker network create ddz # 查看 docker n…

利用Socket动手实现简单HTTP协议

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

python 元组的详细用法

当前版本&#xff1a; Python 3.8.4 文章目录如下 1. 介绍元组 2. 定义元组 3. 访问元组 4. 查询元组 1. 介绍元组 元组&#xff08;Tuple&#xff09;是一个有序的、不可变的数据序列。它可以包含各种类型的数据&#xff0c;例如数字、字符串、列表等。元组使用圆括号()来…