题解 | #寻找连续任务开始位置#
寻找连续任务开始位置
https://www.nowcoder.com/practice/c93fd6c526da40788fd832ef9cd7177e
- 题目考察的知识点 : 字符串匹配,KMP算法
- 题目解答方法的文字分析:
- 在匹配主串 s 的时候,如果当前字符与模式串中 j 指向的字符不同,则将指针 j 移动到 next[j-1] 中所存储的值处继续匹配,直到找到一个匹配或者 j=0 为止。如果找到了一个匹配,那么就说明主串中存在一个子串和模式串完全匹配。
- 我们需要将 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题的解法思路