题解 | #寻找连续任务开始位置#

寻找连续任务开始位置

https://www.nowcoder.com/practice/c93fd6c526da40788fd832ef9cd7177e

  • 题目考察的知识点 : 字符串匹配,KMP算法
  • 题目解答方法的文字分析:
  1. 在匹配主串 s 的时候,如果当前字符与模式串中 j 指向的字符不同,则将指针 j 移动到 next[j-1] 中所存储的值处继续匹配,直到找到一个匹配或者 j=0 为止。如果找到了一个匹配,那么就说明主串中存在一个子串和模式串完全匹配。
  2. 我们需要将 words 数组拼接成一个模式串 pattern,并在 s 中查找一个子串,其包含 words 数组中的所有字符串,并且按照 words 数组中的顺序出现。因此,我们可以将 words 数组中的所有字符串合并成一个长的字符串 pattern,然后通过 KMP 算法在 s 中查找 pattern。当找到一个匹配之后,我们只需要更新最长子串的开始位置即可
  • 本题解析所用的编程语言: Python
  • 完整且正确的编程代码

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @param words string字符串一维数组
# @return int整型
#
class Solution:
    def computeNextArray(self, pattern: str) -> List[int]:
        m = len(pattern)
        j = 0
        next = [0] * m

        for i in range(1, m):
            while j > 0 and pattern[i] != pattern[j]:
                j = next[j - 1]
            if pattern[i] == pattern[j]:
                j += 1
            next[i] = j

        return next

    def findLongestSubstring(self, s: str, words: List[str]) -> int:
        # 将所有的单词拼接成一个模式串
        pattern = "".join(words)

        n, m = len(s), len(pattern)
        if n < m:
            return -1

        # 计算模式串的next数组
        next = self.computeNextArray(pattern)

        i, j = 0, 0
        start, maxLength = -1, -1

        while i < n:
            if s[i] == pattern[j]:
                i += 1
                j += 1
            else:
                if j > 0:
                    j = next[j - 1]
                else:
                    i += 1

            if j == m:
                # 找到了一个匹配的子串
                if i - j > maxLength:
                    maxLength = i - j
                    start = i - m
                # 继续寻找下一个匹配位置
                j = next[j - 1]

        return start
牛客高频top202题解系列 文章被收录于专栏

记录刷牛客高频202题的解法思路

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务