https://leetcode-cn.com/problems/minimum-window-substring/

# -*- coding:utf-8 -*-

class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        weight_list = []
        str_list = []
        temp_weight = 0
        for i in range(len(s)):
            if s[i] not in t:
                temp_weight += 1
                continue
            temp_weight += 1
            str_list.append(s[i])
            weight_list.append(temp_weight)
            temp_weight = 0
        windows_length = len(t)
        current_min_idx = -1
        current_min_val = float('inf')
        for i in range(len(str_list) - windows_length + 1):
            queue = []
            temp_val = 0
            for j in range(windows_length):
                if len(queue) != len(t) and str_list[i + j] not in queue:
                    queue.append(str_list[i + j])
                    if j != 0:
                        temp_val += weight_list[i + j]
                    else:
                        temp_val += 1
                if len(queue) == len(t):
                    if temp_val < current_min_val:
                        current_min_idx = i
                        current_min_val = temp_val
        if current_min_idx == -1:
            return ''
        from_idx = 0
        for i in range(current_min_idx + 1):
            from_idx += weight_list[i]
        return s[from_idx - 1:from_idx + current_min_val - 1]
if __name__ == '__main__':
    S = "aa"
    T = "aa"
    # S = "ADOBECODEBANC"
    # T = "ABC"
    print(Solution().minWindow(S, T))

思路:这道题我感觉我思路挺好的,复杂度应该。。?我也不知道多少,最坏n^2应该是。

首先就是把无关字符全去掉,比如ADOBECODEBANC直接过滤成ABCBAC,然后每一个字母都带一个权重,代表当前字母后n个长度为下一个t中的字符,比如ABCBAC对应一个权重就是1,3,2,4,1,2。因此问题就变成了找最短权重的一个字符串。

我们利用一个t长度的窗口,判断窗口内是不是t中的字符,然后算一下权重,找到权重最低的窗口,根据权重就可以映射到原字符串的索引范围。

上面代码中使用的是列表进行重复判断,但是实际上t是允许重复的,那么我们把列表变成字典,多循环一遍t就可以了。太懒了就不写了,但是思路肯定是对的,对不起对不起对不起对不起,今天出门一天,晚上才回来,实在是不想改这点代码了。

分类: 算法

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注