【无标题】查找最小字符串

from collections import defaultdict, Counter

class Solution(object):
    def __init__(self):
        print(1)
    def minWindow(self, s, t):
        """
        给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串
        :param s:
        :param t:
        :return: 返回
        """

        if not s or not t:
            return ""
        #用来统计字符串t中每个字符出现的次数
        dict_t = Counter(t)
        #用来统计窗口中每个字符出现的次数
        windows_s = defaultdict(int)
        #用来存放字符串t不重复字符个数
        required = len(dict_t)
        #左右窗口的位置
        l, r = 0, 0
        #保存指定字符串最小窗口的位置
        resStart, resLen = 0, float('inf')
        #windows 完全包含t中不重复字符的个数
        formed = 0
        while r < len(s):
            #增加右指针字母的计数
            windows_s[s[r]] += 1
            #如果右指针的字母在t中,且计数相等,则formed计数增加
            if s[r] in dict_t and windows_s[s[r]] == dict_t[s[r]]:
                formed += 1
            #当窗口完全包含字符串时,尝试缩小窗口
            while l <= r and formed == required:
                #更新最小窗口
                if r-l+1 < resLen:
                    resStart, resLen = l, r-l+1
                #左指针计数减少
                windows_s[s[l]] -= 1
                #如果左指针字符在窗口中,且windows窗口的计数小于t的计数,减少formed的计数
                if s[l] in dict_t and windows_s[s[l]] < dict_t[s[l]]:
                    formed -= 1
                #移动左指针
                l += 1
            #移动右指针
            r +=1

        return "" if resLen == float('inf') else s[resStart:resStart+resLen]

if __name__ == '__main__':
    win = Solution()
    result = win.minWindow('abdcccsslsllabc','lsla')
    print(result)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值