首页 > 其他分享 >2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。 定义一个“美丽下标”,当满足以下条件时: 1.找到字符串 a 在字符串 s 中的位

2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数 k。 定义一个“美丽下标”,当满足以下条件时: 1.找到字符串 a 在字符串 s 中的位

时间:2024-05-18 20:56:33浏览次数:16  
标签:cnt 05 18 复杂度 posB pattern 字符串 pi

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:

chatgpt

题目来自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)

在这里插入图片描述

标签:cnt,05,18,复杂度,posB,pattern,字符串,pi
From: https://www.cnblogs.com/moonfdd/p/18199761

相关文章

  • 第二届“重科杯”重庆科技大学程序设计竞赛(同步赛)ptlks的题解(2024.5.18)
    A.Alice和Bob题意:给定序列A和序列,m组信息\((i,j)\),Alice可以交换\(A_i\)和\(A_j\)任意次,判断Alice是否能将序列A转变为序列B。思路由于Alice可以任意调整m组信息,所以题目所给m组信息\((i,j)\)不影响结果。先考虑k组信息,第i组为\((T_i,T_{i+1})\),\(1\leqT_1\ltT_2\lt.........
  • HTML 18 - Lists
     HTMLListisacollectionofrelatedinfomation.Thelistscanbeorderedorunderdereddependingontherequirement.Inhtmlwecancreatebothorderandunorderlistsbyusing<ol>and<ul>tags.Eachtypeoflistcanbedecoratedusingpo......
  • Weblogic T3反序列化漏洞(CVE-2018-2628)
    目录前言T3协议概述漏洞复现修复方案前言WebLogicServer是一个企业级的应用服务器,由Oracle公司开发,支持完整的JavaEE规范,包括EJB、JSP、Servlet、JMS等,适合大型分布式应用和高负载场景。T3协议概述T3协议(Two-TierTCP/IPProtocol),是WebLogic中的一种专有协议,建立在TCP/IP协......
  • 代码随想录算法训练营第十一天 | 20.有效的括号 1047.删除字符串中的所有相邻 重复项
    20.有效的括号题目链接文章讲解视频讲解思路:遍历字符串,如果栈不为空,则进行匹配   如果匹配则出栈,否则入栈   如果栈为空,直接入栈   遍历结束后栈为空则说明全部匹配,否则没有全部匹配classSolution{public:boolisValid(strings){stack<cha......
  • 提取字符串中间的字母数字
    问题:字符串包含汉字、字母、数字、符号等,需要提取汉字后连续9个字母数字符号函数公式解决:老套路: =LEFT(MIDB(A2,SEARCHB("?",A2),99),9)WPS专用新套路: =@REGEXP(A2,"[--Z]+")老套路:SearchB:查找第一个单字节字符的位置MidB:中取汉字后所有字符串Left:左取指定的9个字符串......
  • 20240518模拟赛
    C240518A.传送门(portal)构造一个图使得点\(1\)到\(2\)的最短路正好有\(k\)条,使构造出的图点的个数\(N\len_5\)考虑\(k=2^t\)那么可以轻松构造出如下的图对于其他的情况可以考虑二进制拆分,如\(k=10\)时为了,使最短路长度固定加入点\(9\)对\(k=10^9\),只需构造\(80\)个点,可以......
  • ASE180N08-ASEMI低压N沟道MOS管ASE180N08
    编辑:llASE180N08-ASEMI低压N沟道MOS管ASE180N08型号:ASE180N08品牌:ASEMI批号:2024+沟道:N沟道导通内阻RDS(ON)Max:4.0mΩ启动电压:2V-4V最大漏源电流(Id):180A漏源击穿电压(VRM):80V正向电压:1.3V特性:低压N沟道MOS管引脚数量:3封装:TO-247工作温度:-55°C~175°C类型:低压MOS管、N沟......
  • 代码随想录算法训练营第第11天 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重
    今天的题主要是关于栈的,比较简单,一次性过20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.......
  • 有关字符串的函数接口
    目录strstr函数,用于从一个字符串中查找子串strtok函数,用于分割字符串strstr函数,用于从一个字符串中查找子串strtok函数,用于分割字符串......
  • 2024-05-17 闲话
    昨天去听了一个宣讲,晚上和5wcitation的老师吃了一个饭,收获了一个合影。吃饭的时候和刘夏雷老师交流了一个工作,通俗语言表达如下。连续学习的setting下有一个灾难性遗忘的问题。举一个具体一点的例子:现在我们有一个图片分类的任务,原先有10类,现在要扩充至20类。原先我们建......