2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。 定义一个“美丽下标”,当满足以下条件时: 1.找到字符串 a 在字符串 s 中的位
2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。
定义一个“美丽下标”,当满足以下条件时:
1.找到字符串 a 在字符串 s 中的位置,且该位置范围为 0 <= i <= s.length - a.length。
2.找到字符串 b 在字符串 s 中的位置,且该位置范围为 0 <= j <= s.length - b.length。
3.两个字符串的匹配位置之差的绝对值不超过 k。
需要按照美丽下标的大小升序排列,然后以数组的形式返回这些下标。
输入:s = "isawsquirrelnearmysquirrelhouseohmy", a = "my", b = "squirrel", k = 15。
输出:[16,33]。
答案2024-05-18:
题目来自leetcode3008。
大体步骤如下:
1.定义了 main 函数,其中给定了字符串 s、子字符串 a 和 b,以及整数 k。
2.在 main 函数中调用 beautifulIndices 函数,并输出结果。
3.beautifulIndices 函数中调用了 kmp 函数来找到字符串 a 和 b 在字符串 s 中的所有可能位置。
4.在 kmp 函数中,首先构建了 pattern 的前缀函数 pi。
5.对于子串 a,通过 KMP 算法寻找所有匹配的位置,将它们存储在 posA 中。
6.对于子串 b,同样使用 KMP 算法来寻找所有匹配的位置,将它们存储在 posB 中。
7.然后遍历 posA 中的每个位置 i,在 posB 中查找满足条件的位置 j 和 k,更新 ans。
8.将找到的美丽下标按照升序排列,并以数组形式返回。
总的时间复杂度:
KMP 算法的时间复杂度为 O(n + m),其中 n 是字符串长度,m 是模式串长度。在该问题中,分别对两个子串执行 KMP 搜索,因此总的时间复杂度为 O(n + m) + O(n + m) = O(n + m)。
遍历 posA 和 posB 的时间复杂度为 O(n) + O(n) = O(n),其中 n 是字符串长度。
总的额外空间复杂度:
在 KMP 函数中,构建了模式串的前缀函数 pi,使用了额外的空间来存储 pi 数组,其大小等于模式串的长度,因此空间复杂度为 O(m)。
在 beautifulIndices 函数中,存储了所有匹配的位置,即创建了 posA 和 posB 数组来存储这些位置,空间复杂度为 O(n)。
因此,总的额外空间复杂度为 O(m) + O(n)。
综上所述,总的时间复杂度为 O(n + m),总的额外空间复杂度为 O(m) + O(n)。
Go完整代码如下:
package main
import "fmt"
func beautifulIndices(s, a, b string, k int) (ans []int) {
posA := kmp(s, a)
posB := kmp(s, b)
j, m := 0, len(posB)
for _, i := range posA {
for j < m && posB[j] < i-k {
j++
}
if j < m && posB[j] <= i+k {
ans = append(ans, i)
}
}
return
}
func kmp(text, pattern string) (pos []int) {
m := len(pattern)
pi := make([]int, m)
cnt := 0
for i := 1; i < m; i++ {
v := pattern[i]
for cnt > 0 && pattern[cnt] != v {
cnt = pi[cnt-1]
}
if pattern[cnt] == v {
cnt++
}
pi[i] = cnt
}
cnt = 0
for i, v := range text {
for cnt > 0 && pattern[cnt] != byte(v) {
cnt = pi[cnt-1]
}
if pattern[cnt] == byte(v) {
cnt++
}
if cnt == m {
pos = append(pos, i-m+1)
cnt = pi[cnt-1]
}
}
return
}
func main() {
s := "isawsquirrelnearmysquirrelhouseohmy"
a := "my"
b := "squirrel"
k := 15
result := beautifulIndices(s, a, b, k)
fmt.Println("Result:", result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def beautiful_indices(s, a, b, k):
def kmp(text, pattern):
m = len(pattern)
pi = [0] * m
cnt = 0
for i in range(1, m):
v = pattern[i]
while cnt > 0 and pattern[cnt] != v:
cnt = pi[cnt - 1]
if pattern[cnt] == v:
cnt += 1
pi[i] = cnt
pos = []
cnt = 0
for i, v in enumerate(text):
while cnt > 0 and pattern[cnt] != v:
cnt = pi[cnt - 1]
if pattern[cnt] == v:
cnt += 1
if cnt == m:
pos.append(i - m + 1)
cnt = pi[cnt - 1]
return pos
posA = kmp(s, a)
posB = kmp(s, b)
ans = []
j, m = 0, len(posB)
for i in posA:
while j < m and posB[j] < i - k:
j += 1
if j < m and posB[j] <= i + k:
ans.append(i)
return ans
s = "isawsquirrelnearmysquirrelhouseohmy"
a = "my"
b = "squirrel"
k = 15
result = beautiful_indices(s, a, b, k)
print("Result:", result)

2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。 定义一个“美丽下标”,当满足以下条件时: 1.找到字符串 a 在字符串 s 中的位的更多相关文章
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- Python定义一个函数
Python函数:实现某种功能的代码段 定义一个函数需要遵循的规则: 1.使用 def 关键字 函数名和( ),括号内可以有形参 匿名函数使用 lambda 关键字定义 2.任何传入参数和自变量必须放 ...
- C#定义一个方法的3种形式
[定义方法对象,可使用签名兼容的委托变量来引用它] 1.定义一个方法,采用常规标准写法(V1.0) [本质上是签名兼容的委托类型的实例 / 对象] 2.定义一个方法,采用匿名方法(delegate)( ...
- 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)
需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换 ab 不替换 ba 不替换 aba 不替换 aab 替换为 ...
- .NET种Json时对单引号和特殊字符串的处理
转自:https://www.cnblogs.com/ITniao/archive/2011/01/06/1929261.html .NET种Json时对单引号和特殊字符串的处理 在Asp.NET ...
- 18.12.02-C语言练习:韩信点兵
C语言练习:韩信点兵 题目说明:本题是中国经典问题,有多种解法,从数论课程角度看,是一个不定方程组,而且答案不唯一. 但这里采用程序解法,使用的是暴力破解.枚举可能的解,然后根据条件判断,满足所有条件 ...
- FineReport: 参数为空选出全部值(按条件查询,空条件时直接过滤,不进行查询。。)
在Java报表软件FineReport中,选择特定的参数(如下图中的姓名.身份证号等)后,会返回我们要查询的数据,然而假如没有输入参数值,我们却仍需要返回数据时该怎样处理呢?应该过滤掉这个条件,不按这 ...
- Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序
package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...
- MySQL中0、'0'作为条件时的区别
一.现象: 今天查询时,某字段x为varchar 可能的值为A B C 0 1 2 3 4 想把0 1 2 3 4的所有数据查出,使用的SQL为 select * from table where x ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...
随机推荐
- C++ 编程入门指南:深入了解 C++ 语言及其应用领域
C++ 简介 什么是 C++? C++ 是一种跨平台的编程语言,可用于创建高性能应用程序. C++ 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展. C++ 为程序员提供了对系 ...
- Spring Cloud Alibaba 官方实践指南【文章有点长自备咖啡茶点】
注:本文内容均转自官方文档,方便胖友们学习,不代表博主观点. 链接地址:SpringCloudAlibaba | Spring Cloud Alibaba 基于网关实现 SpringCloud 服务发 ...
- CentOS 6.5 LAMP分主机平台的搭建及测试
CentOS 6.5 LAMP分主机平台的搭建及测试 看似非常之完备,转来抽空测试学习 原文地址:http://www.it165.net/os/html/201403/7595.html 前言 ...
- jenkins 持续集成和交付 —— git hook(七)
前言 这个hook的意思叫做钩子哈,前端听得多. 正文 好吧,这个git hook 有什么用呢? 前面说了一个轮询SCM这个东西呢,我是真的觉得这东西没啥用,经常扫描仓储算怎么回事呢? 但是如果主动通 ...
- 力扣423(java)-从英文中重建数字(中等)
题目: 给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9).按 升序 返回原始的数字. 示例 1: 输入:s = "owoztneoer"输出:&quo ...
- 2022飞天技术峰会:硬之城如何基于 SAE 打造数智化电子工业互联网平台
简介: 全球数字化时代已经到来,数字经济正推动生产方式.生活方式和治理方式的深刻变化,成为重组全球要素资源,重塑经济结构,改变全球竞争格局的关键力量. 本文根据硬之城 CEO 李六七先生在峰会上的分享 ...
- 阿里云安全运营中心:DDoS攻击趁虚而入,通过代理攻击已成常态
应用层DDoS攻击与传统的DDoS攻击有着很大不同.传统的DDoS攻击通过向攻击目标发起大流量并发式访问造成服务不可用,系统瘫痪,这种方式比较容易被识破,且市场上已经有成熟的应对方案.而近年来兴起的应 ...
- 开箱即用!Linux 内核首个原生支持,让你的容器体验飞起来!| 龙蜥技术
简介: 本文将从 Nydus 架构回顾.RAFS v6 镜像格式和 EROFS over Fscache 按需加载技术三个角度来分别介绍这一技术的演变历程. 文/阿里云内核存储团队,龙蜥社区高性能存储 ...
- 什么是好的错误消息? 讨论一下Java系统中的错误码设计
简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据 ...
- 博时基金基于 RocketMQ 的互联网开放平台 Matrix 架构实践
简介: Matrix 经过一年多的建设,目前已具备多渠道统一接入.第三方生态互联互通.基金特色交易场景化封装等功能特性.Matrix 通过建设有品质.有温度的陪伴,从技术上和体验上,让用户理解风险,理 ...