📌  相关文章
📜  所有字符至少出现 K 次的最长子串 |设置 3(1)

📅  最后修改于: 2023-12-03 15:39:40.185000             🧑  作者: Mango

所有字符至少出现 K 次的最长子串 |设置 3

简介

问题描述:给定一个仅包含小写字母的字符串 s 和一个整数 k,你需要找到 s 中最长的子串,要求该子串内的每个字符都出现至少 k 次。

解决方案:我们可以使用滑动窗口的方法解决该问题。首先,我们需要统计字符串 s 中每个字符出现的次数。然后,我们可以将窗口左侧和右侧向右移动,并在移动的过程中维护每个字符出现的次数。如果子串中的每个字符都至少出现了 k 次,那么我们就可以对该子串进行更新,然后将左侧向右移动一个位置。如果子串中的字符不满足要求,那么我们就将右侧向右移动一个位置。

代码实现

下面是 Python 代码实现:

def longestSubstring(s: str, k: int) -> int:
    n = len(s)
    res = 0
    for t in range(1, 27): #t表示字符种类数,最多只有26个小写字母,因此t不会大于26
        l, r = 0, 0
        cnt = [0] * 26 # 统计字符出现的次数
        tot, less = 0, 0 # 记录字符种类数目和出现次数小于k的字符种类数目
        while r < n:
            cnt[ord(s[r]) - 97] += 1 # 转为ASCII码,统计字符出现的次数
            if cnt[ord(s[r]) - 97] == 1:
                tot += 1
                less += 1
            if cnt[ord(s[r]) - 97] == k:
                less -= 1
            while tot > t:
                cnt[ord(s[l]) - 97] -= 1
                if cnt[ord(s[l]) - 97] == k - 1:
                    less += 1
                if cnt[ord(s[l]) - 97] == 0:
                    tot -= 1
                    less -= 1
                l += 1
            if less == 0:
                res = max(res, r - l + 1)
            r += 1
    return res
复杂度分析

时间复杂度:该算法使用了滑动窗口的方法,因此需要遍历字符串一次,每次移动窗口时需要 O(1) 的时间复杂度。因此,时间复杂度为 O(26n),即 O(n)。其中,n 表示字符串 s 的长度。

空间复杂度:该算法中使用了常数个变量,因此空间复杂度为 O(1)。

总结

本题使用了滑动窗口的方法,需要注意细节,如字符出现次数的统计和更新、字符种类数目的计算等。此外,我们还需要注意一些特殊情况,如 k 大于字符串 s 的长度或 s 中只包含一个字符等情况。