32. 最小子串覆盖

32. 最小子串覆盖

中文English

给定两个字符串 source 和 target. 求 source 中最短的包含 target 中每一个字符的子串.

样例

样例 1:

输入: source = "abc", target = "ac"
输出: "abc"

样例 2:

输入: source = "adobecodebanc", target = "abc"
输出: "banc"
解释: "banc" 是 source 的包含 target 的每一个字符的最短的子串.

样例 3:

输入: source = "abc", target = "aa"
输出: ""
解释: 没有子串包含两个 'a'.

挑战

O(n) 时间复杂度

注意事项

  1. 如果没有答案, 返回 "".
  2. 保证答案是唯一的.
  3. target 可能包含重复的字符, 而你的答案需要包含至少相同数量的该字符.

解法一:  同向双指针

class Solution:
    '''
    大致思路:
    1. 给个子函数,判断是否是符合要求的
    2. 双指针解法
    '''
    def minWindow(self, source , target):
        len1, len2 = len(source), len(target)
        if len1 < len2: return ''

        # 定义
        left, right = 0, 0
        count = sys.maxsize
        res = ''
        for index in range(len1 - len2 + 1):
            left, right = index, index + len2
            while right <= len1:
                if self.ifinclude(source[left: right], target):
                    if right - left < count:
                        count = right - left
                        res = source[left: right]
                right += 1 

        return res

    
    def ifinclude(self, source, target):
        ''' 判断是否包含 '''    
        source_dict, target_dict = {}, {}
        for val in source:
            source_dict[val] = source_dict.get(val, 0) + 1
        
        for val in target:
            target_dict[val] = target_dict.get(val, 0) + 1
        
        # 判断
        for val in target:
            if val not in source_dict.keys():
                return False
            else:
                if target_dict[val] > source_dict[val]:
                    return False
        
        return True

注意: 时间复杂度超过限制, Lintcode未通过。

posted @ 2021-01-25 22:40  风不再来  阅读(176)  评论(0编辑  收藏  举报