📌  相关文章
📜  无限字符串的前N个字符中只有4个字符的最长子字符串(1)

📅  最后修改于: 2023-12-03 14:55:08.642000             🧑  作者: Mango

无限字符串的前N个字符中只有4个字符的最长子字符串

简介

有一个无限长的字符串,其中只包含4种字符。现在给定字符串的前N个字符,要求找到其中只包含4种字符的子字符串中最长的一个。

示例

给定字符串的前N个字符为:abcdbbcadbdbcaddcba

其中只包含4种字符:a, b, c, d

其中只包含4种字符的子字符串有以下8种:

  1. abc
  2. bcd
  3. cdb
  4. dba
  5. abd
  6. bbc
  7. ada
  8. ddd

其中最长的子字符串为abcdbbcadbdbc, 包含12个字符。

解法
暴力枚举

我们可以使用两层循环,枚举所有的子串,并判断是否只包含4种字符。时间复杂度为$O(N^2)$。

def find_longest_substring(s):
    n = len(s)
    max_len = 0
    for i in range(n):
        for j in range(i+1, n+1):
            if len(set(s[i:j])) == 4:
                max_len = max(max_len, j-i)
    return max_len
滑动窗口

我们可以使用滑动窗口来进行优化。我们可以维护一个窗口,窗口的右端点不断向右移动,直到窗口中包含了所有的4种字符。然后窗口的左端点不断向右移动,直到窗口中只包含了3种字符。在这个过程中,我们记录下窗口的大小,并更新最大值。时间复杂度为$O(N)$。

def find_longest_substring(s):
    n = len(s)
    max_len = 0
    left, right = 0, 0
    char_set = set()
    while right < n:
        char_set.add(s[right])
        while len(char_set) > 4:
            char_set.remove(s[left])
            left += 1
        max_len = max(max_len, right-left+1)
        right += 1
    return max_len
总结

本题可以用暴力枚举和滑动窗口两种方法来求解,滑动窗口的时间复杂度更优。