Leetcode刷题笔记-分治法divide and conquer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sengo_GWU/article/details/82833395

395. Longest Substring with At Least K Repeating Characters

 

Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.

Example 1:

Input:
s = "aaabb", k = 3

Output:
3

The longest substring is "aaa", as 'a' is repeated 3 times.

Example 2:

Input:
s = "ababbc", k = 2

Output:
5

The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.

思路:没想到是分治法之前,一直做不出来。看到可以用分治法后就很容易。

要找s[i,j]的最大子串,先统计频数,然后遍历一遍频数,找出第一个频数小于k且大于0的字符,然后找出这个字符的位置,接下来的分析很重要,这个字符一定不能出现在任何的子串中,因为i,j是整个的子串,在ij里面频数都没有达到k,那么在ij的任何子串中,这个字符也不可能达到频数k。所以不能有这个字符,那么就在这个位置做一个分治,返回前半部分和后半部分的最大值。 

class Solution(object):
    def longestSubstring(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        return self.divide(0, len(s), s, k)

    def divide(self, start, end, s, k):

        if end > len(s) or end <= 0:
            return 0
        dic = collections.defaultdict(int)
        check = set()
        for i in xrange(start, end):
            dic[s[i]] += 1
        
        for i in xrange(start, end):
            if dic[s[i]] < k:
                check.add(i)
                break
        
        if not check:
            return end - start
        else:
            ids = check.pop()
            return max(self.divide(start, ids, s, k), self.divide(ids + 1, end, s, k))

猜你喜欢

转载自blog.csdn.net/Sengo_GWU/article/details/82833395