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

烦死了
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 <= 10^5
1 <= a.length, b.length <= 10
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/626242.shtml

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

相关文章

如何使用服务器?

文章目录 如何使用服务器&#xff1f;一、工具二、第一种方法三、第二种方法四、实例 个人经验 如何使用服务器&#xff1f; 本文详细介绍了如何利用服务器跑模型&#xff0c;具体流程如下&#xff1a; 一、工具 ToDeskPyCharm Professional移动硬盘JetBrains GatewayGit 二…

dp--62. 不同路径/medium 理解度A

62. 不同路径 1、题目2、题目分析3、复杂度最优解代码示例4、抽象与扩展 1、题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中…

fgets函数和fputs函数

目录 gets和putsfgets和fputs区别 橙色 gets和puts char *gets(char *str); // 从标准输入 stdin 读取一行&#xff0c;并把它存储在 str 所指向的字符串中。当读取到换行符时&#xff0c;或者到达文件末尾时&#xff0c;它会停止&#xff0c;具体视情况而定。 // 如果成功&a…

牛客网-css继承属性

3.当元素的一个继承属性没有指定值时&#xff0c;则取父元素的同属性的计算值&#xff0c;以下哪些不是 CSS 中的继承属性&#xff1f; A. color B.display C.border-style D.text-align 答案&#xff1a;BC 解析&#xff1a;不可继承&#xff1a;display&#xff0c;mar…

免费的域名要不要?

前言 eu.org的免费域名相比于其他免费域名注册服务&#xff0c;eu.org的域名后缀更加独特。同时&#xff0c;eu.org的域名注册也比较简单&#xff0c;只需要填写一些基本信息&#xff0c;就可以获得自己的免费域名。 博客地址 免费的域名要不要&#xff1f;-雪饼前言 eu.org…

网站优化之favicon.ico

本文于2015年底完成。 背景 某一天在办公室分析产品首页加载速度时&#xff0c;无意中从Chrome浏览器的调试窗口看到浏览器在请求一个名为favicon.ico文件&#xff0c;由于Web系统的根路径下不存在这个文件&#xff0c;Chrome仅报了404访问失败&#xff0c;但当时没有太关注。…

卡码网 16 set集合

判断集合成员 前言 之前我们讲到&#xff0c;哈希表的主要作用是判断给定的整数是否存在于给定的数据中, 哈希表常使用的数据结构有数组、set集合、map映射, 上节课我们学习了数组作为哈希表&#xff0c;这节课我们来学习set集合, 具体包括下列内容 set、unordered_set, mul…

Sqoop安全性:确保安全的数据传输

确保数据传输的安全性在大数据处理中至关重要。Sqoop作为一个用于数据传输的工具&#xff0c;也提供了多种安全性措施&#xff0c;以确保数据在传输过程中的机密性和完整性。本文将深入探讨Sqoop的安全性特性&#xff0c;提供详细的示例代码和全面的内容&#xff0c;以帮助大家…

基于WebFlux的websocket的分组和群发实现

一,分组发送 在WebFlux中实现分组发送数据和群发数据给所有客户端发送&#xff0c;可以借助Sinks.Many来管理消息流&#xff0c;并使用Flux进行订阅和发送消息。以下是一个示例代码&#xff0c;演示如何实现这两个功能&#xff1a; import org.springframework.stereotype.Co…

读元宇宙改变一切笔记09_硬件与互操作性(下)

1. 移动互联网的继承者 1.1. 要想让元宇宙成为现实&#xff0c;需要开发新的标准&#xff0c;创建新的基础设施&#xff0c;可能还需要对长期存在的TCP/IP协议进行彻底改革 1.1.1. 采用新的设备和硬件&#xff0c;甚至可能打破技术巨头、独立开发者和终端用户之间的权利平衡 …

Go+快速开始详细指南

Go快速开始 Go编程语言是为工程、STEM教育和数据科学设计的。 对于工程:用儿童能掌握的最简单的语言工作。对于STEM教育:学习一门可以在未来工作中使用的工程语言。对于数据科学:用同一种语言与工程师交流。 安装方法 现在&#xff0c;我们建议您从源代码安装Go。 注意:需…

CDMP认证与CDGA/CDGP的区别有哪些?

&#x1f451;CDMP是DAMA国际组织的全英文考试 &#x1f308;CDGA和CDGP是DAMA中国主导&#xff0c;考试为中文考试。需要在规定的时间内报名后&#xff0c;参加线下笔试考试。 &#x1f44d;CDGA、CDGP证书和英文版的CDMP证书都是国际通用的&#xff0c;是数据管理领域专业的职…

js等于操作符和全等操作符(== 和 ===)的区别,在什么情况下使用

在JavaScript中&#xff0c;&#xff08;等于操作符&#xff09;和&#xff08;全等操作符&#xff09;都是用来比较两个值是否相等的工具&#xff0c;但它们有一些重要的区别。 会尝试进行类型转换&#xff0c;然后再比较。这意味着它可能会将不同类型的值转换为相同类型&…

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

3妹&#xff1a;呜呜&#xff0c;烦死了&#xff0c; 脸上长了一个痘 2哥 : 不要在意这些细节嘛&#xff0c;不用管它&#xff0c;过两天自然不就好了。 3妹&#xff1a;切&#xff0c;你不懂&#xff0c;影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊&#xff0c; 工作…

IP 网络分为接入网、城域网和骨干网

根据前述的IP 网络设计思想&#xff0c;结合算力网络对 正网络的需求分析&#xff0c;卫网络的具体实现可以从架构设计利网络技术两个方面进行总体设计。 首先从架构设计上考虑&#xff0c;架构应尽量简化&#xff0c;做到“以简应繁”。因此&#xff0c;整体网络架构不宜设计…

爬虫-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;对文件不…