给你一个字符串 word 和一个字符串数组 forbidden 。如果一个字符串不包含 forbidden 中的任何字符串我们称这个字符串是 合法 的。请你返回字符串 word 的一个 最长合法子字符串 的长度。子字符串 指的是一个字符串中一段连续的字符它可以为空。
首先,我们可以将 forbidden 数组转化为一个集合,方便后续判断一个字符串是否在 forbidden 中。
然后,我们从字符串 word 的第一个字符开始,依次遍历每一个字符。如果当前字符与 forbidden 中的某个字符串匹配,我们就将当前字符的索引记为 end。
在遍历的过程中,我们还需要维护一个变量 start 来记录合法子字符串的起始位置。如果当前字符与 forbidden 中的某个字符串匹配,我们就更新 start 为 end 的下一个位置。
每次遍历到一个字符,我们都计算当前合法子字符串的长度,并与之前的最大长度进行比较,更新最大长度。
最后,我们返回最大长度作为结果。
下面是具体的实现代码:
def longestSubstring(word, forbidden): forbidden_set = set(forbidden) start = 0 end = -1 max_length = 0
for i, char in enumerate(word):
if char in forbidden_set:
end = i
max_length = max(max_length, end - start)
start = end + 1
return max(max_length, len(word) - start)
这个算法的时间复杂度是 O(n),其中 n 是字符串 word 的长度。因为我们需要遍历一次字符串 word,并在每次遍历时都进行一些常数时间的操作
原文地址: https://www.cveoy.top/t/topic/h6gL 著作权归作者所有。请勿转载和采集!