Description
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
示例 1:
输入:
s = "aaabb", k = 3
输出:
3
最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:
输入:
s = "ababbc", k = 2
输出:
5
最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution
代码题解
解题思路:递归拆分子串,分治。先统计出每个字符出现的频次,维护一对双指针,从首尾开始统计,从首尾往中间排除,如果出现次数小于k则不可能出现在最终子串中,排除并挪动指针,然后得到临时子串,依次从头遍历,一旦发现出现频次小于k的字符,以该字符为分割线,分别递归求其最大值返回。
作者:tzfun
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/solution/javadi-gui-by-tzfun/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution:
def longestSubstring(self, s: str, k: int) -> int:
if len(s) < k:
return 0
# 找个字符串个数最少的字符
t = min(set(s), key=s.count)
# 最少字符的个数都大于等于k
if s.count(t) >= k:
return len(s)
# 相信longestSubstring()能够返回正确的结果,只需要在上层检查结果返回就行了
return max(self.longestSubstring(a,k) for a in s.split(t))
作者:powcai
链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters/solution/hua-dong-chuang-kou-fen-zhi-fa-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。